Я использую C++, чтобы создать базовое семейство с полиморфизмом. Тем не менее, я получаю ошибки при компиляции, и я не знаю, как их исправить (я говорю class dependency
как родитель и ребенок и зависят друг от друга, прежде чем другой создается): C2061C++ Полиморфизм/ошибка зависимости класса
ошибка: ошибка синтаксиса : идентификатор 'Parent'
ошибка C2143: синтаксическая ошибка: отсутствует ';' перед '*'
ошибка C4430: отсутствует спецификатор типа - int. Примечание: C++ не поддерживает по умолчанию-INT
ошибка C2065: 'родитель': необъявленный идентификатор
ошибка C2065: 'Имя': необъявленный идентификатор
ошибка C2614: 'ребенок': недопустимый инициализации члена : 'пар' не является основание или член
ошибка C2065: 'пар': необъявленный идентификатор
ошибка C2227: слева '-> AddChild' должен указывать на класс/структура/объединение/общий тип
C2065 ошибка: 'п': необъявленный идентификатор
ошибка C2227: слева от '-> Имя' должно указывать на класс/структуры/объединения/общий тип
ошибка C2661: 'Детский :: Детский': нет перегруженная функция принимает 2 аргумента
ошибка C2065: 'п': необъявленный идентификатор
ошибка C2227: слева от '-> Имя' должно указывать на класс/struct/union/generic тип
/* Polymorphism Family */
#include <iostream>
#include <vector>
class Child{
public:
Child(Parent* parent, char* name) : par(parent), Name(name){ par->addChild(this); };
Parent* par;
char* Name;
virtual void Speak(void){
std::cout << "I am a child, my name is " << Name << " and my parent's name is " << par->Name << std::endl;
}
};
class Parent{
public:
Parent(char* name) : Name(name){};
char* Name;
std::vector<Child*> Children;
virtual void Speak(void){
std::cout << "I am a parent called " << Name << std::endl;
if(Children.size() == 0){
std::cout << "I have no children" << std::endl;
}
else{
std::cout << "I have " << Children.size() << " children:" << std::endl;
for(auto c : Children){
std::cout << c->Name;
}
}
}
void addChild(Child* child){
Children.push_back(child);
}
};
class Father : public Parent{
public:
Father(char* name) : Parent(name){}
void Speak(void){
std::cout << "I am a father called " << Name << std::endl;
if(Children.size() == 0){
std::cout << "I have no children" << std::endl;
}
else{
std::cout << "I have " << Children.size() << " children:" << std::endl;
for(Child* c : Children){
std::cout << c->Name;
}
}
}
};
class Son : public Child{
public:
Son(Parent* parent, char* name) : Child(parent, name){}
void Speak(void){
std::cout << "I am a son, my name is " << Name << " and my parent's name is " << par->Name << std::endl;
}
};
int main(void){
Father* Dad = new Father("James");
Dad->Speak();
Son* John = new Son(Dad, "John");
John->Speak();
Dad->Speak();
delete[] Dad, John;
getchar();
return (0);
}
Edit: У меня есть 2 ошибки сейчас:
/* Polymorphism Family */
#include <iostream>
#include <vector>
class Parent;
class Child{
public:
Child(Parent* parent, char* name);
Parent* par;
char* Name;
virtual void Speak(void){
std::cout << "I am a child, my name is " << Name << " and my parent's name is " << par->Name << std::endl;
}
};
class Parent{
public:
Parent(char* name) : Name(name){};
char* Name;
std::vector<Child*> Children;
virtual void Speak(void){
std::cout << "I am a parent called " << Name << std::endl;
if(Children.size() == 0){
std::cout << "I have no children" << std::endl;
}
else{
std::cout << "I have " << Children.size() << " child(ren):" << std::endl;
for(auto c : Children){
std::cout << c->Name << std::endl;
}
}
}
void addChild(Child* child){
Children.push_back(child);
}
};
Child::Child(Parent* parent, char* name){
Child::par = parent;
Child::Name = name;
par->addChild(this);
};
class Father : public Parent{
public:
Father(char* name) : Parent(name){}
void Speak(void){
std::cout << "I am a father called " << Name << std::endl;
if(Children.size() == 0){
std::cout << "I have no children" << std::endl;
}
else{
std::cout << "I have " << Children.size() << "child(ren):" << std::endl;
for(auto c : Children){
std::cout << c->Name << std::endl;
}
}
}
};
class Son : public Child{
public:
Son(Parent* parent, char* name) : Child(parent, name){}
void Speak(void){
std::cout << "I am a son, my name is " << Name << " and my parent's name is " << par->Name << std::endl;
}
};
int main(void){
Father* Dad = new Father("James");
Dad->Speak();
Son* John = new Son(Dad, "John");
John->Speak();
Dad->Speak();
delete[] Dad, John;
getchar();
return (0);
}
Используйте вперед декларация разорвать циклическую зависимость. Кроме того, 'delete [] Dad, John' не делает то, что вы думаете –
Ваш код очень плохой. См. [_Modern C++ _] (http: // klmr.me/slides/modern-cpp/# 1) и [_Индивидуальный C++ Book Guide и List_] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). – rightfold
Ваш компилятор должен выводить номера строк в сообщениях об ошибках. Для этого есть веская причина! – Roddy