4

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

#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 类都相互依赖,并且都有另一个类型的对象。我所做的是在另一个文件中前向声明这两个类。有没有一种干净的方法可以做到这一点?

4

2 回答 2

3

是的。但是你应该使用 ClassA* a;orClassA& a;代替ClassA a;(在 cpp 文件中进行相应的初始化),因为没有关于 size of 的信息ClassA来计算ClassB.

于 2012-04-21T18:19:35.730 回答
3

一般来说,跨标头前向声明类是合法的。

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

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

ClassA1 个字节不带bClassB1 个字节不带a. 现在,包括bClassA现在需要 2 个字节。现在包括aClassB现在需要 3 个字节。现在我们必须将 的大小更新ClassA为 4 个字节,因为ClassB. 按照这个逻辑ClassB现在是 5 个字节、ClassA6 个字节、ClassB7 个字节......

为了解决这个问题,您可能希望将(至少)其中之一的类型更改为a指针b或对相应类的引用。执行此操作时(在 c/c++ 中),请确保您了解内存管理!

您原来的问题的解决方案可能如下所示:

类A.h

#pragma once
class ClassB;
class ClassA
{
public:
    ClassB* b;
}

B类.h

#pragma once
#include "ClassA.h"
class ClassB
{
public:
    ClassA a;
}

请注意,ClassB.h 需要 ClassA.h,因为出于演示目的:ClassB包含 type 的完整对象ClassA,因此ClassA需要定义 !

于 2012-04-21T18:20:37.967 回答