gpt4 book ai didi

c++ - C++ 中的相互类实例

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:08:50 25 4
gpt4 key购买 nike

这段代码有什么问题?这里我们有两个文件:classA.h 和 classB.h

classA.h:

#ifndef _class_a_h_
#define _class_a_h_

#include "classB.h"

class B; //????

class A
{
public:
A() {
ptr_b = new B(); //????
}

virtual ~A() {
if(ptr_b) delete ptr_b; //????
num_a = 0;
}

int num_a;
B* ptr_b; //????
};

#endif //_class_a_h_

classB.h:

#ifndef _class_b_h_
#define _class_b_h_

#include "classA.h"

class A; //????

class B
{
public:
B() {
ptr_a = new A(); //????
num_b = 0;
}

virtual ~B() {
if(ptr_a) delete ptr_a; //????
}

int num_b;
A* ptr_a; //????
};

#endif //_class_b_h_

当我尝试编译它时,编译器 (g++) 说:

classB.h: In constructor ‘B::B()’:

classB.h:12: error: invalid use of incomplete type ‘struct A’

classB.h:6: error: forward declaration of ‘struct A’

classB.h: In destructor ‘virtual B::~B()’:

classB.h:16: warning: possible problem detected in invocation of delete operator:

classB.h:16: warning: invalid use of incomplete type ‘struct A’

classB.h:6: warning: forward declaration of ‘struct A’

classB.h:16: note: neither the destructor nor the class-specific operator delete will be

called, even if they are declared when the class is defined.

最佳答案

您不能创建不完整类型的实例(编译器对类一无所知!)

您需要将函数的定义(A 和 B 的构造函数)移动到一个可以包含两个头文件的 C++ 文件中(或者移动到多个 C++ 文件中,如果您遵循每个文件一个类的约定)。

话虽如此,您编写的代码有一个严重的问题:每个 A 创建一个 B 的实例,每个 B 创建一个 A 的实例。您将以无限递归结束,最终会耗尽内存。

两个小问题:在对指针调用 delete 之前不需要测试指针是否为空(删除空指针是安全的),并且需要更改包含保护(名称中以下划线开头的名称)全局命名空间保留给实现)。

关于c++ - C++ 中的相互类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2542343/

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