C++嵌套在分离的头文件中
C++ nested class in separated header file
我想将嵌套类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;
}
但一旦我尝试将Inner类放在一个单独的头中,如下所示:
class Outer{
class Inner;
public:
Outer():i(*this){}
~Outer(){};
Inner i;
};
并将Inner类放置在'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:错误:字段"I"的类型不完整。
我或多或少地理解为什么,但我找不到一个问题来实现我想做的事情。
要创建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;
};
你需要在源文件中这样做,因为你需要include
类Inner
的头文件(你不能直接在头文件中include
它,因为你会遇到循环依赖(两个头文件将相互包括),因为Inner
的头文件也需要Outer
的头文件)。
这也被称为pImpl习语-"指向实现的指针",根据使用的编码约定,Inner
通常被称为Impl
和成员pImpl
或类似的东西。这个想法是隐藏任何实现细节,比如私有/受保护的成员(函数、数据)。
如果不想将i
成员变成指针,最好的选择是将Inner
的定义移到Outer
之外,并使用名称空间进行嵌套。
请注意,在这种情况下,您需要在Outer
的定义之前包含Inner.h
标头。
相关文章:
- .h 和.cpp文件分离时出错,但仅使用 .h 文件时没有错误.我做错了什么?
- 如何在 c++ 中将数据与文件流分离
- C++将文件行分离为String和Int
- 真的需要在 .h 和 .cpp 文件中分离 c++ 结构吗?
- 在动态加载的位置无关的可执行文件中分离错误
- 使用 CLion 在不同文件中分离 Boost 测试套件的正确方法
- 在分离类时,使用CPP文件中的功能会导致错误
- C++分离头文件和源文件
- c++为类和.cpp文件分离文件,函数不是类的一部分
- 如何将显式声明的构造函数分离到 .h 和 .cpp 文件中?
- C++嵌套在分离的头文件中
- 文件输入分离
- 无法分离标头和cpp文件(包括错误和代码)
- 如何从字符串/文件中分离字符和整数
- 如何执行从另一个Qt程序分离的C++可执行文件
- 将dll与c++项目中的其他输出文件分离
- C++简介:将字符串从文件行中的数字中分离出来,并对这些数字求和
- 从文本文件中读取数据并分离出每行中包含的数据
- C++生成文件,同时分离声明和实现
- 在google测试中跨多个文件分离测试用例