gpt4 book ai didi

c++ - 派生类错误 : undefined type

转载 作者:行者123 更新时间:2023-11-28 00:54:58 25 4
gpt4 key购买 nike

代码如下所示:

class B {/*something*/};

class D1: public B {
public:
void set() = 0;
friend int D2::get(D1&);
private:
int a;
}
class D2: public B {
public:
int get(D1& d) {return d.a;}
}

我在派生类的 .h 文件(“D1.h”和“D2.h”)和“D2.h"在 D1 中,"D1.h" 在 D2 中......但不断出现编译错误:

...\D2.h ... use of undefined type D1

那么我做错了什么?谢谢。

最佳答案

您创建了一个循环包含:您将 D1.h 包含到 D2.h 中,并将 D2.h 包含到 中D1.h。循环包含永远不会起作用,也永远不会取得任何成就。

您的循环包含是类定义之间循环依赖的直接结果。在您的代码中,两个类定义以一种要求两个类类型都完整(完全定义)的方式相互引用。这意味着无论您做什么,都无法按原样编译您的代码。您需要打破类定义之间的循环依赖。

在您的情况下,可以通过以下方式完成。

保持D1.h不变,即保持D2.h包含在D1.h中,保持类D1的定义 原样。

但是,不要D1.h包含到D2.h中,而是引入D1的前向声明进入 D2.h

class D1;

D2的定义改为

class D2: public B {
public:
int get(D1& d);
};

注意:不要试图在类 D2 的定义中正确定义方法 get。您必须将 D2::get 的定义重新定位到某个其他地方,其中 D1 的完整定义也是可见的(如 D2.cpp 例如,它应该包括D1.hD2.h)

int D2::get(D1& d) 
{
return d.a;
}

就是这样。以这种方式定义 D2::get 的一个副作用是它变成了非内联的。如果你真的想让它保持内联,你必须将它定义为

inline int D2::get(D1& d) 
{
return d.a;
}

并确保它以某种方式仅包含在 D1 的完整定义之后。例如,您可以将它放入第三个头文件(D2_aux.h 或类似的文件)并记住将它包含在D1.h之后/.

当然,尝试解决此问题的更好方法是重新考虑整个设计。您真的需要 D1 中的友元声明吗?也许您应该以某种方式重新设计您的代码以消除对友元声明的需要,从而消除这种依赖性。


或者,您可以通过更改 D1.h 并保持 D2.h 不变来解决它。但是,要遵循该路径,您必须替换“细粒度” friend 声明

friend int D2::get(D1&);

更加宽容和宽容

friend class D2;

并从 D1.h 中删除包含的 D2.h

以前的 friend 声明要求类 D2 是完整的,这实际上创建了一个“牢不可破”的依赖关系。后一个声明不需要 D2 是完整的。

关于c++ - 派生类错误 : undefined type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11991215/

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