我想知道是否可以在不包含类源文件的情况下使用类的目标文件链接和编译源代码文件。
或者
就像在 Java 中一样,我可以在不提供源代码的情况下将编译后的 *.class 文件和该类的文档提供给 friend ,并且他可以在不知道真正源代码的情况下根据需要包含该类。
我可以用 C++ 做同样的事情吗?以及如何?
仅供引用:我正在使用 MinGW。
我是新手,所以这可能看起来像一个愚蠢的问题(但仍然没有愚蠢的问题)。
最佳答案
在 C++ 中,您可以只生成一个可执行文件(在 Windows 中为 .exe,在 Linux 中通常没有扩展名)或一个库文件(.lib 或 .a)或一个共享库(.dll 或 .so),具体取决于您使用的是什么想要实现。
如果您要提供一个库,您还必须提供一个带有类声明的头文件。如果你不想透露太多细节,你可以有一个“实现”类,它只是一个指向头文件中实现的指针,真正的实现只对你作为类的所有者可用来源。
有关更多信息,您应该按照 Thomas Matthews 的建议查找“PIMPL”——它是“Pointer to IMPLementation class”的缩写。基本上,您的“公共(public)”类只是一个提供您希望其他人看到的功能的外壳,它内部的实现类完成了所有艰苦的工作。
简单的例子
在你的头文件中:
// Forward declaration of the implementation class.
class double_it_impl;
// Class that stores an integer, and doubles it each time you
// call doubling().
class Public_double_it
{
public:
public_double_it(int x); // COnstructor.
int doubling(); // Function d
private:
double_it_impl *pImpl;
};
在您的源文件或私有(private)头文件中,我们声明实际的实现:
class double_it_impl
{
public:
double_it_impl(int x) : m_x = x; {};
int doubling() { m_x *= 2; return m_x; }
}
public_double_it::public_double_it(int x)
{
pImpl = new public_double_it(x);
}
int public_double_it::doubling()
{
return pImpl->doubling();
}
现在你看不到实现类包含什么或者它是如何工作的——当然,这是一个非常微不足道的例子,但我希望它传达了这个想法。
关于java - 如何将类的目标文件与源文件链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14307165/