2012-02-19 4 views
1

У меня возникают некоторые вопросы относительно наследования. У меня есть класс Person и класс Student: Person, Employee: Person. Ошибки, с которыми я столкнулся, - я не понимаю, почему я их получаю. Я использовал крошечную пасту, чтобы вставить код, поскольку я думал, что здесь потребуется слишком много места. Если я поставил вопрос в другом месте, дайте мне знать. Благодарю.Проблемы с наследованием C++

Код Файлы:

Вот ошибки, которые я получаю:

1>------ Build started: Project: PR4_Students, Configuration: Debug Win32 ------ 
1>Build started 2/18/2012 11:14:27 PM. 
1>InitializeBuildStatus: 
1> Touching "Debug\PR4_Students.unsuccessfulbuild". 
1>ClCompile: 
1> main.cpp 
1>\\cs1\cs_students\mlindahl15\cs273\pr4_students\student.h(15): error C2969: syntax error : ';' : expected member function definition to end with '}' 
1>\\cs1\cs_students\mlindahl15\cs273\pr4_students\student.h(16): error C2059: syntax error : 'inline function header' 
1>\\cs1\cs_students\mlindahl15\cs273\pr4_students\student.h(16): error C2630: ';' found in what should be a comma-separated list 
1>\\cs1\cs_students\mlindahl15\cs273\pr4_students\employee.h(15): error C2969: syntax error : ';' : expected member function definition to end with '}' 
1>\\cs1\cs_students\mlindahl15\cs273\pr4_students\employee.h(16): error C2059: syntax error : 'inline function header' 
1>\\cs1\cs_students\mlindahl15\cs273\pr4_students\employee.h(16): error C2630: ';' found in what should be a comma-separated list 
1> Student.cpp 
1>\\cs1\cs_students\mlindahl15\cs273\pr4_students\student.h(15): error C2969: syntax error : ';' : expected member function definition to end with '}' 
1>\\cs1\cs_students\mlindahl15\cs273\pr4_students\student.h(16): error C2059: syntax error : 'inline function header' 
1>\\cs1\cs_students\mlindahl15\cs273\pr4_students\student.h(16): error C2630: ';' found in what should be a comma-separated list 
1>\\cs1\cs_students\mlindahl15\cs273\pr4_students\student.cpp(8): error C2084: function 'Student::Student(void)' already has a body 
1>   \\cs1\cs_students\mlindahl15\cs273\pr4_students\student.h(15) : see previous definition of '{ctor}' 
1> Employee.cpp 
1>\\cs1\cs_students\mlindahl15\cs273\pr4_students\employee.h(15): error C2969: syntax error : ';' : expected member function definition to end with '}' 
1>\\cs1\cs_students\mlindahl15\cs273\pr4_students\employee.h(16): error C2059: syntax error : 'inline function header' 
1>\\cs1\cs_students\mlindahl15\cs273\pr4_students\employee.h(16): error C2630: ';' found in what should be a comma-separated list 
1>\\cs1\cs_students\mlindahl15\cs273\pr4_students\employee.cpp(8): error C2084: function 'Employee::Employee(void)' already has a body 
1>   \\cs1\cs_students\mlindahl15\cs273\pr4_students\employee.h(15) : see previous definition of '{ctor}' 
1> Generating Code... 
1> 
1>Build FAILED. 
1> 
1>Time Elapsed 00:00:05.64 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 
+1

Добро пожаловать в сообщество SO на C++, Майкл! В будущем заработайте пункты «коричневого», пометив домашние вопросы, связанные с [тегом: домашнее задание]. – Potatoswatter

+0

'Student(): Person();' неверно. Вам нужно только указать список инициализаторов в определении конструктора, а не в объявлении. Попробуйте просто 'Student();'. –

ответ

4

Я не анализировал весь код, но вы, кажется, смущены тем, как объявлять вызовы конструктору базового класса;

class Student : public Person 
{ 
... 
    Student() : Person(); 
... 
}; 

Вызов конструктора базового класса должен быть сделан на фактической реализации только конструктора. Так как вы уже делаете, что с

Student::Student() : Person() { 

вы можете просто изменить объявление в

class Student : public Person 
{ 
... 
    Student(); 
... 
}; 

и все должно получиться лучше.

Редактировать: добавление ответа на последующий вопрос ниже;

Линия

Employee(string department, string jobTitle, int yearOfHire) 
    : Person(name, socialSecurityNumber, age, gender, address, phoneNumber) { 

делает по той же причине, на самом деле не имеет смысла.Если вы хотите иметь возможность создать Employee со всеми этими параметрами, вам нужно вместо этого объявить конструктор как;

Employee(string department, string jobTitle, int yearOfHire, name, 
     socialSecurityNumber, age, gender, address, phoneNumber) { 

и осуществить его как

Employee::Employee(string department, string jobTitle, int yearOfHire, name, 
     socialSecurityNumber, age, gender, address, phoneNumber) 
    : Person(name, socialSecurityNumber, age, gender, address, phoneNumber) { 

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

+0

Спасибо. Как создать объект Student с аргументами Person и Student? – michaellindahl

+0

Возможно, вы полностью не понимаете свой вопрос здесь, но чтобы заставить его вызвать конструктор Person с параметром, переданным конструктору Student, просто измените строку реализации на «Student :: Student (int age): Person (age) {'. Естественно, Человеку нужен конструктор, чтобы на самом деле вызвать возраст и в качестве параметра. –

+0

Позвольте привести пример. В настоящее время я думаю, что IDE хочет этот код: 'personVector.push_back (новый Employee (« Sales »,« VP », 2008));« Однако я думал, что это что-то вроде этого: 'personVector.push_back (новый Employee (« Sales »,« VP », 2008,« John », 123456789, 19, 'm',« Unknown », 3218424222));' – michaellindahl

4

В строке 15 Students.h:

Student() : Person(); 

Это недопустимо. Либо вам нужно полностью определить конструктор, либо вообще нет.

Итак:

Student() : Person() { some code; }; 

или:

Student(); 

и поставить фактический код в файле реализации.

+0

У вас есть конструктор по умолчанию и перезаписанный конструктор в файле реализации? Я думал, что перезаписываемые конструкторы должны быть в файле заголовка. – michaellindahl

+0

Я не понимаю ваш вопрос - что такое перезаписанный конструктор? Если вы не имеете дело с шаблонами, вы можете размещать вещи либо в заголовке, либо в файлах реализации. То, что вы не можете сделать, - это определение частичного конструктора, как вы. – Mat

+0

Хорошо. Понимаю. Я говорил о: 'Student()', 'Student (int age)' и 'Student (имя строки, int age)'. Мне сказали, что ничего, кроме 'Student()', должно быть в файле .h. Но согласно тому, что вы говорите, они должны быть в файле .cpp? – michaellindahl

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