我希望将我的部分代码编译为静态库,以包含在其他项目中。当然,我必须分发编译的库和包含类声明和公共成员的头文件,但我不知道是否可以将所有私有成员和声明移动到与头文件不同的地方。
示例:
在project.h文件中:
class MyClass
{
public:
MyClass();
void Give_me_an_input(int);
int Get_your_output();
private:
int a, b;
int MySecretAlgorithm();
};
在.cpp文件中:
MyClass::MyClass()
{
a = 1;
b = 0;
}
void MyClass::Give_me_an_input(int c)
{
b = c;
}
int MyClass::Get_your_output()
{
return MySecretAlgorithm();
}
int MyClass::MySecretAlgorithm()
{
return (a + b);
}
有没有办法将所有私人成员int a, b;
和int MySecretAlgorithm();
移到与头文件不同的位置?
答案 0 :(得分:3)
指向实现习惯用法的指针可用于这种情况,通常称为pimpl。 基本思想是从声明中获取实现细节 并且只是有一个指向实现细节的不透明指针。
std::unique_ptr
用于以下示例中;但你当然可以使用普通指针。
// my_class declaration unit.
class my_class {
private:
class impl;
unique_ptr<impl> pimpl;
public:
};
// my_class implementation unit
class my_class::impl {
int whatever;
int whenever;
};
my_class::my_class(): pimpl( new impl )
{
}
答案 1 :(得分:2)
您可以考虑将所有公共事物都设为抽象类(所有虚拟= 0),然后从中派生出具体类。
这方面: - 所有公共呼叫都变为虚拟(某些优化可以绕过此,但不经常)。 - 你不能新的&#39;你的课程了,你需要实现工厂模式。
我熟悉的任何其他黑客的问题是,他们基本上在一组标题中声明方法,然后用真实的&#39;重新声明相同的东西。私有头中的实现 - 取决于链接器以匹配名称。这里有几个问题:
维持这个烂摊子很糟糕。你不能使用#ifdef,因为听起来你想隐藏你的实现。因此,您可以使用双维护或生成公共标题的构建步骤。
只能通过指针使用。你必须玩游戏,使构造函数成为私有的,并且仍然有工厂,因为如果让客户端按值生成(甚至是新的),编译器将不会生成正确大小的结构。
最后,我曾经看过程序员试图在“公共”的私有区域中声明一个字节数组的黑客攻击。 class,以便客户端代码仍然可以通过值或“&#39; new”来声明。它本身。这会遇到所有以前的问题,而且你可能不想知道&#39;结构的大小,因为它们取决于包装和对齐。您的构建步骤&#39;或多或少必须有一个使用sizeof()的运行时组件 - 如果你想改变struct / class的大小,现在你有版本问题。