gpt4 book ai didi

c++ - 解决交叉引用

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:58:45 25 4
gpt4 key购买 nike

我在创建具有不同对象类型的某种形式的层次结构时遇到问题。我有一个类(class),其中有另一个类(class)的成员,像这样:

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;
};

这是 B 类:

class B
{
public:
void addOwner(A* owner){
ownerObject = owner;
}

//ISNT WORKING
void printOwner(){
ownerObject->print();
}

private:
A* ownerObject;
};

从类“A”中调用“B”的函数工作得很好,但反之亦然会产生编译器错误,因为 A 未在 B 中定义。它实际上是通过使用包含和前向声明,但我猜测是编译器无法解决的交叉引用问题。

是否有机会解决这个问题,或者我应该重新考虑我的设计?

最佳答案

您说您已经通过使用 A 的前向声明而不是包含定义了 A 的 header 来解决循环依赖问题,因此您已经知道如何避免循环包含。但是,您应该注意 what is possible and what is not with incomplete types (即已向前声明的类型)。

在您的例子中,您尝试在类型不完整的对象上调用成员函数 print;编译器对这个类型一无所知,除了它会在某个时候被定义,所以它不允许你这样做。解决办法是把B头中printOwner成员函数的实现去掉,放到一个实现文件中:

//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
}

您可以在 A header 中执行相同的操作。

关于c++ - 解决交叉引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3735321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com