我想知道我是否可以使用类的目标文件链接和编译源代码文件,而不包括类源文件。
或者
就像在Java中一样,我可以将编译的* .class文件提供给朋友和该类的文档而不提供源代码,并且他可以在不知道真实来源的情况下将该类包含在他的需要中。
我可以用C ++做一些事吗?怎么样?
仅供参考:我正在使用MinGW。
我很新,所以这可能看起来像一个愚蠢的问题(但仍然没有愚蠢的问题)。
答案 0 :(得分:1)
在C ++中你可以生成一个可执行文件(Windows中的.exe,Linux中通常没有扩展名)或库文件(.lib或.a)或共享库(.dll或.so),具体取决于你想要实现。
如果您要提供库,则必须提供包含类声明的头文件。如果您不想过多地提供有关详细信息,可以使用“实现”类,它只是指向头文件中实现的指针,并且实际实现仅作为所有者可用。源。
有关更多信息,您应该像Thomas Matthews所建议的那样查找“PIMPL” - 这是“指向IMPLementation类的指针”的缩写。基本上,你的“公共”类只是一个提供你希望别人看到的函数的shell,而它里面的实现类可以完成所有的工作。
简单示例
在您的标头文件中:
// 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;
};
在源文件或私有头文件中,我们声明实际的实现:
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();
}
现在你看不到实现类包含的内容或它是如何工作的 - 当然,这是一个非常简单的例子,但我希望它传达了这个想法。
答案 1 :(得分:0)
你可以给他们* .class,但他们可以反编译。
大多数库都是使用类和生成的Javadoc提供的。
答案 2 :(得分:0)
您可以将该类编译为库或dll或共享库,并将其提供给您的朋友。
他们需要一个定义接口的头文件。
另见PIMPL习语。
答案 3 :(得分:0)
是的,您可以提供编译的目标文件和文档,其他人可以将.o(或.obj)文件链接到其代码中。有关如何执行此操作的具体细节因编译器和开发环境而异。如果您使用的是g ++,只需使用以下命令行:
g++ -c source.cpp
这将创建一个.o文件,您(或其他任何人)可以使用
与其他.o文件链接g++ main.o source.o
其他编译器也有类似的选择。有关如何创建目标文件的说明,请阅读帮助文件和其他文档。
对于大量函数和/或类,您应该查看创建库文件。这些可以静态或动态链接。如果您想了解如何创建自己的库文件,我建议您在Web上搜索更多信息。