C ++ классы и векторы - PullRequest
       2

C ++ классы и векторы

0 голосов
/ 15 марта 2019

Я смущен этим!Я продолжаю получать сообщение об ошибке:

addSchool не объявлено в области

и,

нет соответствующей функции дляпозвоните school::addschool()

Я не вижу, как они не объявлены.(Я также новичок в программировании)

School является классом, и один из членов этого класса является векторным указателем.

.h Файл:

class school {
private:
    vector<school*> schools;

public:
    school();
    void addSchool(school *s);
};

.cpp файл:

void school::addSchool(school *s){
    vector<school *> schools;
    s = new school();
    schools.push_back(s);
}

main функция:

school *newSchool = new school();
school::addSchool(&newSchool);
delete newSchool;

Ответы [ 2 ]

0 голосов
/ 15 марта 2019

Здесь, похоже, есть 2 основные проблемы. Ошибка, которую вы получаете, заключается в том, как вы звоните addSchool(). Вы используете синтаксис для вызова статической функции, когда она объявлена ​​как член. Чтобы назвать его как член:

school.addSchool(newSchool);

Обратите внимание, что вместо :: используется ., но также указывается, что newSchool уже является указателем, поэтому не берите его адрес. (Как уже отмечали другие)

Другие проблемы - ошибки времени выполнения в вашем методе addSchool. Вы создаете локальный вектор, не используя член. Вы также игнорируете отправленный параметр.

void school::addSchool(school *s) {
    for( i=0; i < s->size(); i++) {
        this.schools.push_back(s[i]);
    }
}

Теперь, когда я это записываю, я понимаю, что здесь есть и еще одна логическая проблема в том, каким на самом деле должен быть этот класс. Это школа, которая содержит список школ, так что вы добавляете школу в этот список или комбинируете списки? В то время как такие вещи имеют смысл для списков ссылок и деревьев, ваш пример говорит "школы", поэтому я бы переосмыслил это. Возможно, ваш класс должен быть школьным округом и содержать список школ:

class District{
private:
    vector<school *> schools; // school declared elsewhere
public:
    District();
    inline int Size() { return this.schools.size(); };
    inline int Get(int i) { return this.schools[i]; };
    void addSchool(school *s);
    void addSchools(District *d);
}

// adding to the list
void District::addSchool(school *s) {
    this.schools.push_back(s);
}

// adding the contents of another like class, consider operator overloading + instead
void District::addSchools(District *d) {
    for( i=0; i < d->Size(); i++) {
        this.schools.push_back( d->Get(i) );
    }
}

В качестве альтернативы, если вы хотите использовать одну статическую функцию в качестве основного списка, найдите шаблон проектирования Singleton .

0 голосов
/ 15 марта 2019

Несколько проблем здесь :

  • Вызов функции нестатического члена, как если бы это была статическая функция.Измените прототип функции следующим образом:

    static void addSchool(school *s);

  • Передача указателя на указатель на school в функции addSchool, которая принимает только указатель на school.Измените вызов функции следующим образом:

    school::addSchool(newSchool);

  • Объявление локального vector из schools в функции addSchool вместо использования уже доступныхprivate участник vector<school *> schools.Это добавит только к локальному vector из schools, а не к члену vector из schools.Удалите следующую строку в функции addSchool

    vector<school *> schools;

  • Выделение памяти для school снова в функции addSchool.Это приведет к утечке памяти.Вы должны выделить память только один раз.Если вы хотите сделать это в main, удалите следующую строку в функции addSchool.

    s = new school();

  • Удаление памяти, выделенной в main должно быть сделано только в конце программы.В противном случае вас оставят висеть с vector недопустимых указателей.

Я думаю, что:

  • vector из schools также должно быть static, поскольку оно не относится к конкретному экземпляру.В этом случае измените объявление vector из schools на следующее:

    static vector<school *> schools;

См. Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...