你可以使用PIMPL
,并将所有私人领域的私人相关类,如:
// foo.h
class FooPrivate; /* Forward declaration */
class Foo {
public: /* Public fields, if any */
Foo(); /* c-tor */
~Foo(); /* d-tor */
/* Public methods */
int how_old_is_frisky(); /* Sample method declaration */
private: /* No private fields */
FooPrivate *priv;
}
// foo.cpp
// may be a struct, it's plain ol' data container
class FooPrivate {
public:
/* Any data private to Foo. As FooPrivate
class is declared in .cpp file, it
will be accessible only from this file */
Bar bar;
Cat frisky;
Dog goggie;
}
/* Constructor - remember to allocate private data */
Foo::Foo()
{
priv = new FooPrivate;
}
/* Destructor, remember to deallocate private data */
Foo::~Foo()
{
delete priv;
}
/* Sample method definition */
int Foo::how_old_is_frisky()
{
return priv->frisky.get_age();
}
这样:
- 你的头是短了很多
- 您的私人数据是真正的私有
- 为2的结果,如果你改变你的类的实施,你不必重新编译仅使用接口的每个源文件。
此外,如示例所示,在源文件(.cpp
)文件中放置方法定义(即方法体)。这样他们将只被编译一次。如果将它们放在标题中,则每次编译标题时都会对它们进行编译。
--- --- EDIT
的2点和3不是隐藏从恶意观看者的眼睛的数据成员。在C++中有一个“特性”,它使私有成员成为接口的一部分。理想情况下,私有成员应该是实现的一部分,因此接口的用户不应该受实现变化的影响。不幸的是,C++并非如此。当您更改私人成员(即添加新成员)时,您将更改整个类接口,因此您的界面的用户(即包含头文件的所有文件)必须重新编译。
但是,当您使用pointer-to-implementation
模式,唯一的私有成员是一个指针,所以只能做公共成员变动引发的客户端代码重新编译(除非你,当然,改变priv
指针)。要查看真实生活中的示例,请查看广泛使用PIMPL模式的Qt库。
请注意,创建像__INCLUDE_FOO_H这样的名称在您自己的代码中是非法的。并且通常不需要复杂的类嵌套。 – 2010-07-07 07:36:58
“我有一个很大的C++类,其中包含5个其他类,其中一些类还包含其他类。” ... *为什么?* ... – 2010-07-07 07:52:03
我需要内部类,因为它们仅与父类相关,并且没有其他含义。例如,它是一个容器和其中的物品。 – yegor256 2010-07-07 08:02:45