在另一个文件c ++中转发声明

时间:2012-04-21 18:08:09

标签: c++ forward-declaration

在另一个标题的文件中转发声明是否合法?例如:

#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类相互依赖,两者都有另一种类型的对象。我所做的是前进在另一个文件中声明了两个类。有干净的方法吗?

2 个答案:

答案 0 :(得分:3)

是。但是,您应该使用ClassA* a;ClassA& a;而不是ClassA a;(在cpp文件中进行相应的初始化) 由于没有关于ClassA大小的信息来计算ClassB的大小。

答案 1 :(得分:3)

通常,在标题之间转发声明类是合法的。

但是,在您的示例中,您要在彼此实例化这两个类,这绝对是非法的!

为了说明这背后的原因,请考虑以下事项:

ClassA在没有b的情况下占用1个字节,在ClassB不占用a的情况下占用1个字节。 现在,包括bClassA现在占用2个字节。现在包括aClassB现在占用3个字节。现在,由于ClassA的大小增加,我们必须将ClassB的大小更新为4个字节。遵循逻辑ClassB现在是5个字节,ClassA 6个字节,ClassB 7个字节.......

为了解决这个问题,您可能希望将ab中的一个(至少)类型更改为指向相应类的指针或引用。这样做时(在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