解决交叉引用问题

Sid*_*ect 5 c++

我在创建具有不同对象类型的某种形式的层次结构时遇到问题.我有一个类,其中包含另一个类的成员,如下所示:

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标题中执行相同的操作.