在另一个标题的文件中转发声明是否合法?例如:
#ifndef _MAIN_H_
#define _MAIN_H_
class ClassA;
class ClassB;
#include "classa.h"
#include "classb.h"
#endif
#ifndef _CLASSA_H_
#define _CLASSA_H_
#include "main.h"
class ClassA
{
public:
ClassB b;
};
#endif
#ifndef _CLASSB_H_
#define _CLASSB_H_
#include "main.h"
class ClassB
{
public:
ClassA a;
};
#endif
A类和B类相互依赖,两者都有另一种类型的对象。我所做的是前进在另一个文件中声明了两个类。有干净的方法吗?
答案 0 :(得分:3)
是。但是,您应该使用ClassA* a;
或ClassA& a;
而不是ClassA a;
(在cpp文件中进行相应的初始化)
由于没有关于ClassA
大小的信息来计算ClassB
的大小。
答案 1 :(得分:3)
通常,在标题之间转发声明类是合法的。
但是,在您的示例中,您要在彼此实例化这两个类,这绝对是非法的!
为了说明这背后的原因,请考虑以下事项:
让ClassA
在没有b
的情况下占用1个字节,在ClassB
不占用a
的情况下占用1个字节。
现在,包括b
:ClassA
现在占用2个字节。现在包括a
:ClassB
现在占用3个字节。现在,由于ClassA
的大小增加,我们必须将ClassB
的大小更新为4个字节。遵循逻辑ClassB
现在是5个字节,ClassA
6个字节,ClassB
7个字节.......
为了解决这个问题,您可能希望将a
和b
中的一个(至少)类型更改为指向相应类的指针或引用。这样做时(在c / c ++中),确保你了解你的内存管理!
原始问题的解决方案可能如下所示:
ClassA.h
#pragma once
class ClassB;
class ClassA
{
public:
ClassB* b;
}
ClassB.h
#pragma once
#include "ClassA.h"
class ClassB
{
public:
ClassA a;
}
请注意,ClassB.h需要ClassA.h,因为出于演示目的:ClassB
包含ClassA
类型的完整对象,因此需要定义ClassA
!