2010-11-16 2 views
0

Я пытаюсь динамически выделять массив базовых (Student) классов, а затем назначать указатели на производные (Math) классы для каждого слота массива. Я могу заставить его работать, создав единственный указатель на базовый класс, а затем назначив это производному классу, но когда я пытаюсь назначить указатель на динамически выделенный массив базовых классов, он терпит неудачу. Я разместил фрагменты кода, который я использую ниже. Так что в основном мой вопрос: почему не динамически выделяется одна работающая?Динамическое распределение классов с проблемой наследования

Student* studentList = new Student[numStudents]; 
    Math* temp = new Math(name, l, c, q, t1, t2, f); 
    studentList[0] = temp;         

/*Fragment Above Gives Error: 

main.cpp: In function âint main()â: 
main.cpp:55: error: no match for âoperator=â in â* studentList = tempâ 
grades.h:13: note: candidates are: Student& Student::operator=(const Student&)*/ 



    Student * testptr; 
    Math * temp = new Math(name, l, c, q, t1, t2, f); 
    testptr = temp 
    //Works 

ответ

1

studentList[0] не является указателем (т.е. Student *), это объект (т.е. Student).

Это похоже на то, что вам нужно, это массив указателей. В этом случае, вы должны сделать что-то вроде:

Student **studentList = new Student *[numStudents]; 
Math *temp = new Math(name, l, c, q, t1, t2, f); 
studentList[0] = temp; 

В этом фрагменте кода, тип studentList является Student **. Таким образом, тип studentList[0] составляет Student *.

(Обратите внимание, что в C++, есть лучше, более безопасные способы сделать это, с участием классов контейнеров и смарт-указатели. Тем не менее, это выходит за рамки данного вопроса.)

+0

Хорошо, я видел это в C++ книгу, которую я чему-то научился, поэтому я должен ее рассмотреть. – dubyaa

+0

'new Student * [numStudents];' Почему там указатель? Единственная часть этого, которую я не понимаю. – dubyaa

+0

@dubyaa: Поскольку вам нужно создать массив элементов, каждый из которых является «Student *». –

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