我在创建具有不同对象类型的某种形式的层次结构时遇到问题.我有一个类,其中包含另一个类的成员,如下所示:
class A
{
public:
A(){}
~A(){}
void addB(B* dep){
child = dep;
dep->addOwner(this);
}
void updateChild(){
child->printOwner();
}
void print(){
printf("Printing...");
}
private:
B* child;
};
Run Code Online (Sandbox Code Playgroud)
这是B级:
class B
{
public:
void addOwner(A* owner){
ownerObject = owner;
}
//ISNT WORKING
void printOwner(){
ownerObject->print();
}
private:
A* ownerObject;
};
Run Code Online (Sandbox Code Playgroud)
在类"A"之外调用"B"的函数可以正常工作但反之亦然会产生编译器错误,因为A未在B中定义.它实际上是通过使用包含和前向声明,但我想它是一个编译器无法解决的交叉引用问题.
有没有机会解决这个问题,还是我应该重新考虑我的设计?
Luc*_*lle 10
你说你已经通过使用前向声明解决了你的循环依赖问题,A而不是包括A定义的头部,所以你已经知道如何避免循环包含.但是,您应该了解不完整类型(即已向前声明的类型)的可能性和不可能性.
在您的情况下,您尝试print在具有不完整类型的对象上调用成员函数; 编译器对此类型一无所知,除了它将在某个时刻定义,因此它不允许您这样做.解决方案是printOwner从头中删除成员函数B的实现并将其放入实现文件中:
//B.hpp
class A; // forward declaration
class B
{
public:
void addOwner(A* owner);
void printOwner() const; // I think this member function could be const
private:
A* ownerObject;
};
//B.cpp
#include "B.hpp"
#include "A.hpp" // here we "import" the definition of A
void B::addOwner(A * owner)
{
ownerObject = owner;
}
void B::printOwner() const
{
ownerObject->print(); //A is complete now, so we can use its member functions
}
Run Code Online (Sandbox Code Playgroud)
您可以在A标题中执行相同的操作.
| 归档时间: |
|
| 查看次数: |
10707 次 |
| 最近记录: |