在另一个文件c ++中的前向声明
Posted
技术标签:
【中文标题】在另一个文件c ++中的前向声明【英文标题】:forward declaration in another file c++ 【发布时间】:2012-04-21 18:08:09 【问题描述】:在另一个头文件中转发声明是否合法?例如:
#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 类都相互依赖,并且都有另一个类型的对象。我所做的是在另一个文件中前向声明这两个类。有没有一种干净的方法可以做到这一点?
【问题讨论】:
你需要打破这个循环。尝试考虑如果您尝试创建 A 的实例会发生什么。(创建 A,需要创建 B,需要为此创建 A,需要为此创建 B,...) 这就是耦合。不是吗?为什么需要彼此的定义?具体例子?如果它们的功能如此相似,你能把它们变成子类吗? @CppLearner "你为什么需要彼此的定义?"我的错误 虽然很糟糕,但归根结底这是一个设计问题。因此,您实际上应该提供两个类的实际名称以及它们的作用。从那里我们可以帮助找出最佳设计实践。 您需要(或者更确切地说,应该)为此使用指针。 【参考方案1】:一般来说,跨标头前向声明类是合法的。
但是,在您的示例中,您正在彼此实例化两个类,这绝对是非法的!
要说明这背后的原因,请考虑以下几点:
让ClassA
在没有b
的情况下占用1 个字节,ClassB
也在没有a
的情况下占用1 个字节。
现在,包括 b
:ClassA
现在占用 2 个字节。现在包括 a
:ClassB
现在占用 3 个字节。由于ClassB
的大小增加,现在我们必须将ClassA
的大小更新为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
的定义!
【讨论】:
【参考方案2】:是的。但是你应该使用ClassA* a;
或ClassA& a;
而不是ClassA a;
(在cpp文件中有相应的初始化)
因为没有关于ClassA
大小的信息来计算ClassB
的大小。
【讨论】:
以上是关于在另一个文件c ++中的前向声明的主要内容,如果未能解决你的问题,请参考以下文章