我正在尝试创建一个包含两个其他对象的类,并且这些对象应该保持指向它们所包含的类的指针。对于
例如......(我只使用对象实例变量,在最后的想象中有一个类与ClassB非常相似)
这只是我的main.cpp,我想将其包括在内是彻底的......
//Filename: main.cpp
#include "ClassA.hpp"
int main(int argc, char **args) {
ClassA *a = new ClassA();
// There would be some more here in the real code
return 0;
}
现在问题中的课程......
//Filename: classA.hpp
#ifndef CLASSA_H
#define CLASSA_H
#include "ClassB.hpp"
class ClassA {
public:
ClassA() {
b = new B(this);
};
virtual ~ClassA();
private:
ClassB *b;
};
#endif //CLASSA_H
现在这是另一个文件......
#ifndef CLASSB_H
#define CLASSB_H
#include "ClassB.hpp"
//Filename: classB.hpp
class ClassB {
public:
ClassB(ClassA *parent) {
this->parent = parent;
};
virtual ~ClassB();
private:
A *parent;
};
#endif //CLASSB_H
当我尝试编译它时,我收到错误“错误:ClassA没有命名类型”然后当然是“错误:期望”)'''''令牌之前“ 我的猜测是这与他们有什么关系,包括彼此?
(不确定它是否重要,但在实际代码中,函数实现在包含标题的.cpp文件中。会这样做吗?)
答案 0 :(得分:3)
我假设这些是拼写错误,但是当你classA
时,我可能会误解A *
。
你需要做的是转发声明类,即。
class ClassA;
class ClassB{
...
};
和ClassA
class ClassB;
class ClassA{
....
};
答案 1 :(得分:1)
添加
class ClassA;
ClassB定义之前的; 简单的例子:
class B;
class A {
B * b;
};
class B {
A * a;
};
int main(int argc, char ** argv) {
return 0;
}
答案 2 :(得分:1)
你可以通过以下两种方式之一做到这一点;要么你可以使ClassA和ClassB实现一个接口(或者你在C ++中的超类),然后让每个类都有一个定义为接口的指针。第二种方法是在每个类之前使用前向声明(即在定义ClassA之前定义ClassB和ClassB前向声明之前的ClassA前向声明)。