C++ 仅在.h文件中包含专用数据的标题

C++ 仅在.h文件中包含专用数据的标题,c++,include,header-files,C++,Include,Header Files,我在class.cpp和class.h中定义了一个类。该类为私有成员和方法使用了stuff.h(当然还有stuff.cpp)中定义的一些结构/类/类型/任何内容。我的主程序在main.cpp中,它包括sclass.h,但不关心stuff.h中的任何内容。如果有区别,class.cp应该动态加载(.dll/.so)。 理想情况下,我希望stuff.h仅包含在class.cpp和stuff.cpp中,仅链接到此文件,因为它们链接到最终程序只会造成main.cpp中的名称空间污染和额外膨胀。 问题是我

我在
class.cpp
class.h
中定义了一个类。该类为私有成员和方法使用了
stuff.h
(当然还有
stuff.cpp
)中定义的一些结构/类/类型/任何内容。我的主程序在
main.cpp
中,它包括
s
class.h
,但不关心
stuff.h
中的任何内容。如果有区别,
class.cp
应该动态加载(.dll/.so)。
理想情况下,我希望
stuff.h
仅包含在
class.cpp
stuff.cpp
中,仅链接到此文件,因为它们链接到最终程序只会造成
main.cpp
中的名称空间污染和额外膨胀。
问题是我必须在
class.h
中包含
stuff.h
,因为它的定义在我的类的
private:
部分中使用,这部分都在
class.h
中。由于
main.cpp
引入了
class.h
,它也得到了
stuff.h


我希望这是清楚的。在C#中,这可以通过分部类来解决。在C++中我该怎么做?

看起来你需要这里。Pimpl的主要思想是使用实现转发声明类,而不是包含它的定义。这允许您删除在头文件中实现的依赖性,这通常会导致编译速度加快,尤其是在大型项目上。

< P>您在C++中使用PIML来实现,在这里,您所公开的类只有一个属性,即一个部分定义的结构(有时人们使用空隙*,但是使用相同的EFEFCT)。
然后,部分定义的结构在
stuff.cpp
中被完全定义,并且一切都按照您的预期工作--唯一的障碍是您需要确保构造函数和析构函数新建/删除内部实现,你需要在你的复制构造函数和赋值操作符中做出特殊规定
operator=
——大多数人选择将复制构造函数和赋值操作符私有化,如果使用了
stuff.h
的符号,编译器会反对。

您是否担心
main.cpp
中会包含
stuff.h
的符号,或者实际的定义?意思-如果您只有
stuff.h
中的符号的前向声明,它还会在
main.cpp
中引起问题吗?@eli-iser什么是前向声明?如Soren和ks1322所述-如果您有
类stuff
,您可以在
class.h
中使用它,而不使用
#包括
ing
stuff.h
使用前减速-
class stuff。这将使代码< >代码> h >代码>识别类<代码> THOS<代码>没有<代码> >包含< /C> > .eLi iSER,但它仍然会在<代码> Meal.CPP < /Cord>?@巴鲁克-在下面的答案中查看维基百科链接——它提供了C++,关于如何完成这一切的cut-n-paste示例。您还可以使用智能指针进行pimpl,并摆脱构建/破坏私有实现的麻烦。@Marthinho,有趣的建议,您有可以参考的示例吗?boost文档中有一个示例:(顺便说一句,该页面充满了其他宝石。)
struct
被定义为
private
这一事实使得
main.cpp
完全不知道if?它除了作为类型名之外,在任何其他意义上都没有定义,因此它对main.cpp根本不重要——它不知道任何属性,或者在其上工作的任何运算符--main.cpp只能创建指向该结构的指针,而不能创建其他任何对象,而且它是在类中定义的,这意味着您的命名空间也不会受到污染