【发布时间】:2013-12-24 16:11:45
【问题描述】:
我正在使用 C++ 创建一个具有多态性的基本系列。但是,我在编译时遇到错误,我不知道如何纠正它们(我说class dependency,因为在创建另一个之前,Parent 和 Child 都相互依赖):
错误 C2061:语法错误:标识符“父”
错误 C2143:语法错误:缺少 ';'在'*'之前
错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 没有 支持默认整数
错误 C2065:“父”:未声明的标识符
错误 C2065:“名称”:未声明的标识符
错误 C2614:'Child':非法成员初始化:'par' 不是 基地或成员
错误 C2065:'par':未声明的标识符
错误 C2227:'->addChild' 的左侧必须指向 类/结构/联合/泛型类型
错误 C2065:'par':未声明的标识符
错误 C2227:'->Name' 左侧必须指向类/结构/联合/通用 输入
错误 C2661: 'Child::Child' : 没有重载函数需要 2 个参数
错误 C2065:'par':未声明的标识符
错误 C2227:'->Name' 左侧必须指向类/结构/联合/通用 输入
/* 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);
}
编辑:我现在有 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++ 和The Definitive C++ Book Guide and List。
-
你的编译器应该在它的错误信息上输出行号。这是有充分理由的!
-
嗨。 @user2976089 您是否通过在线编译器检查了此代码,以及我在答案的附加部分中提供的选项?
标签: c++ class polymorphism