2017-01-11 3 views
0

Я новичок в обучении C++ и застрял в конструкторах. У меня есть класс Teacher и класс Subject. В классе Teacher a есть объект Subject S[]. Как я могу инициализировать конструктор из класса TeacherS[]? Я попытался это: в Teacher.h файлКак инициализировать с помощью конструктора объект из другого класса?

class Teacher 
{ 
    private: 
    string name; 
    Subject *S[20]; 
    public: 
    Teacher(); 
} 

в Teacher.cpp файл

Teacher::Teacher() 
{ 
    name=" "; 
    for(int i=0; i<20; i++) 
    { 
    S[i].Subject(); 
    } 
} 

в Subject.cpp файл конструкторе:

Subject::Subject() 
{ 
    day=0; 
    hour=0; 
    for(int i=0; i<10; i++) 
    { 
    classroom[i]=" "; 
    } 
} 
+0

это основа, получить хорошую книгу и практиковать. –

ответ

1

так, как вы в настоящее время имейте это, вам придется написать

S[i] = new Subject();

вместо

S[i].Subject();

Но что обременяет вас, чтобы помнить, чтобы позвонить delete в какой-то момент. Было бы далеко лучше использовать

std::list<Subject> S;

вместо

Subject *S[20];

и затем push_back или даже ярче emplace_back вместо S[i].Subject();

См http://en.cppreference.com/w/cpp/container/list

+1

Любая причина, почему не 'std :: vector'? – Rakete1111

+0

Мне кажется, что список скорее представляет собой естественный контейнер для моделирования списка тем. – Bathsheba

+0

Я бы сказал, что невозможно сказать, какой контейнер более естественен, пока мы не знаем, какие операции понадобятся. Например, если субъекты будут фактически удалены, а итераторы к другим элементам должны оставаться действительными. –

1

В классе преподавателя есть объект Subject S []

Нет вы не:

Subject *S[20]; 

Teacher::S представляет собой массив указателей.

S[i].Subject(); 

. используется для доступа к члену. Указатели не имеют членов, поэтому это синтаксически неправильно. Кроме того, вы никогда не вызываете конструктор напрямую. Он вызывается автоматически в результате инициализации переменной или новое выражение.


кажется, что хотят иметь массив объектов Subject в качестве члена вместо этого.Это, как вы бы объявить такого члена:

Subject S[20]; 

объекты в массиве будет построен до того, как тело Teacher конструктору выполняется.

+0

Проблема с фиксированным массивом заключается в том, что всегда есть girlyswot, который принимает 21 объект. – Bathsheba

+0

@ Bathsheba true. Наибольшее преимущество использования массива статического размера заключается в том, что вы быстро научитесь ценить динамические структуры данных, когда в конечном итоге узнаете о них. – user2079303

+0

Хорошо, я изменил объявление объекта Subject 'S [20];', но в конструкторе учителя 'S [i] .Subject();' не работает. – user5624945

Смежные вопросы