2013-12-24 2 views
-4

Я использую 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); 
} 
+1

Используйте вперед декларация разорвать циклическую зависимость. Кроме того, 'delete [] Dad, John' не делает то, что вы думаете –

+2

Ваш код очень плохой. См. [_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

+0

Ваш компилятор должен выводить номера строк в сообщениях об ошибках. Для этого есть веская причина! – Roddy

ответ

2

Child Ваш класс использует Parent класс, который не был определен еще (не выше по коду, до Child или в некоторых из включенных файлов). Чтобы исправить эту проблему, просто объявите класс Parent (или «выше») Child. Например:

class Parent; 

//child class declaration as posted in your code and other classes include Parent. 
class Child{ 
public: 
    Child(Parent* parent, char* name) : par(parent), Name(name){ par->addChild(this); }; 
    Parent* par; 
... 

Надеюсь, это поможет.

[Добавлено] Вот рабочий пример кода, заданный автор:

#include <iostream> 
#include <vector> 

using namespace std; 

class Child; 

class Parent { 

public: 
    Parent(const char* name) : Name(name){}; 
    const char* Name; 
    std::vector<Child*> Children; 

    void Speak(void); 
    void addChild(Child* child); 
}; 

class Child{ 
public: 
    Child(Parent* parent, const char* name) { 
     Child::par = parent; 
     Child::Name = name; 
     par->addChild(this); 
    } 

    Parent* par; 
    const 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; 
    } 
}; 

void Parent::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 Parent::addChild(Child* child) { 
     Children.push_back(child); 
    } 

class Father : public Parent{ 
public: 
    Father(const 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, const 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(int argc, char** argv){ 

    //i suggest you to use stack-located variables against heap-located 
    Father Dad("James"); 
    Dad.Speak(); 

    Son John(&Dad, "John"); 
    John.Speak(); 
    Dad.Speak();  

    // Father* Dad = new Father("James"); 
    // Dad->Speak(); 
    // Son* John = new Son(Dad, "John"); 
    // John->Speak(); 
    // Dad->Speak(); 
    // delete Dad; 
    // delete John; 
    //getchar(); 
    return (0); 
} 

Выход на online cpp editor

Compiling the source code.... 
$g++ -std=c++11 main.cpp -o demo -lm -pthread -lgmpxx -lgmp -lreadline 2>&1 

Executing the program.... 
$demo 
I am a father called James 
I have no children 
I am a son, my name is John and my parent's name is James 
I am a father called James 
I have 1child(ren): 
John 
+0

Я все еще получаю 4 ошибки, хотя – user2976089

+1

Пожалуйста, опубликуйте эти ошибки. – nndru

+0

'Использование неопределенного родителя' дважды,' left of -> addChild должен указывать на класс/struct/union/generic type', 'left of -> name должен указывать на ...' – user2976089

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