gpt4 book ai didi

单独的头文件中的 C++ 嵌套类

转载 作者:可可西里 更新时间:2023-11-01 17:54:33 26 4
gpt4 key购买 nike

我想将嵌套类 Inner 从 Outer.h 移动到单独的头文件中:

class Outer{
class Inner{
public:
Inner(Outer& o){}
};

public:
Outer():i(*this){}
~Outer(){}
Inner i;
};

对于“main.cpp”

#include "Outer.h"
int main(){
Outer o;
return 0;
}

但是一旦我尝试将内部类放在一个单独的标题中,如下所示:

class Outer{
class Inner;

public:
Outer():i(*this){}
~Outer(){};
Inner i;
};

然后像这样将内部类放在“Inner.h”中:

class Outer::Inner{
public:
Inner(Outer& o){}
};

并像这样添加到主 #include 'Inner.h' 中:

#include "Outer.h"
#include "Inner.h"
int main(){
Outer o;
return 0;
}

我从编译器收到以下错误:Outer.h:10:9: error: field 'i' has incomplete type.

我或多或少地理解为什么,但我找不到实现我想做的事情的问题。

最佳答案

要创建 Outer 对象,类的内存布局必须是已知的,在这种情况下,它不是(正是因为 Inner 的不完整性)。

这样做的方法是使用指针,然后前向声明将起作用(因为指针具有固定大小,然后 Outer 的内存布局将是已知的)。


我的意思是:

// header file
class Outer{
class Inner;

public:
Outer();
~Outer();

Inner* i;
};

然后,在类 Outer 的源文件中,定义

// include header file for Outer and Inner classes

// source file
Outer::Outer()
{
i = new Inner( *this );
};
Outer::~Outer()
{
delete i;
};

你需要在源文件中这样做,因为你需要includeInner的头文件(你不能include它直接在头文件中,因为会遇到循环依赖(两个头文件会相互包含),因为Inner的头文件也需要Outer ).


这也称为 pImpl 成语 - “指向实现的指针”,通常 Inner 称为 Impl 并且成员 pImpl 或类似的东西,具体取决于使用的编码约定。这个想法是隐藏任何实现细节,例如私有(private)/ protected 成员(函数、数据)。

关于单独的头文件中的 C++ 嵌套类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21902304/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com