【发布时间】:2011-02-02 07:05:57
【问题描述】:
这段代码有什么问题? 这里我们有两个文件: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:在构造函数'B::B()'中:
classB.h:12: 错误:无效使用不完整类型‘struct A’
classB.h:6: 错误:'struct A' 的前向声明
classB.h:在析构函数‘virtual B::~B()’中:
classB.h:16:警告:在调用删除运算符时检测到可能的问题:
classB.h:16:警告:不完整类型“struct A”的使用无效
classB.h:6:警告:“结构 A”的前向声明
classB.h:16:注意:析构函数和特定于类的运算符 delete 都不会
调用,即使它们在定义类时声明。
【问题讨论】:
-
每当类如此耦合时,您的设计可能需要一些重构。
-
@GMan:除了实现迭代器模式之外,非常同意。 +1。