什么是分发C++类的最佳方式?

6
我创建了一个大的C++类,需要给另一个人使用。我不希望他看到函数实现,但他应该能够将其作为类使用。(例如:他可以继承这个类,在他的代码中使用其全部功能,但不能看到或更改函数实现等)
如何做到这一点?谢谢。
5个回答

8

你的代码很不可能值得保密。一些C++代码,比如模板和函数,如果你想要在用户代码中内联,必须放在头文件中。如果你真的想要一定程度的保密性,可以将非模板函数的实现放在.cpp文件中,编译成库,然后分发头文件和库。当然,用户仍然可以检查库的机器代码。


1
保密是浪费每个人的时间(并且束缚了任何程序员在理解或修复您的类中出现的错误时的手脚)。此外,将C++代码编译为库会将其绑定到您构建的特定平台。因此,如果必须这样做,请在.cpp文件上使用代码混淆器,以便它们可以重新编译(但是,再次强调,这种保密将浪费您和他人的时间):http://en.wikipedia.org/wiki/Obfuscated_code - HostileFork says dont trust SE

8
在C++中,一个类只是一个句法结构。您可以自由地将类按照所需的方式分布在文件中。您可以将每个类放入其自己的头文件/.cpp文件对中,创建仅包含头文件的类,将它们分散到许多文件中-任您喜欢。
在C++中,您不会分发类,而是分发文件。为了使用您的代码,他人需要编译器的所有声明(类和其他内容)以及与这些声明匹配的链接器的所有定义。(有关声明和定义的详细信息,请参见this answer)。
声明通常放在头文件中,在C++中通常使用.h.hpp结尾的方式。(还有其他约定,但这是我见过的大多数约定。)
定义可以分布在源代码(.cpp文件)中,也可以在其编译形式的目标文件中。如果需要多个目标文件,则它们通常会组装在库中(在类Unix系统上通常使用.a结尾,在Windows上使用.lib)。

所以这些是硬性事实:

  1. 你无法避免分发头文件。这是毋庸置疑的。
  2. 如果你不想让别人看到你的定义,你需要编译它们并分发目标文件,最好作为库。

    但是分发库肯定有其缺点。C++没有为编译代码定义二进制API,因此代码必须始终使用相同的编译器相同的编译器版本相同的编译器设置进行编译才能链接在一起。
    这意味着你要么必须规定你的客户端的编译器设置(如果他们有来自不同供应商的库 - 这很可能会出现冲突),这对他们来说很难接受;要么你必须考虑满足他们所有的需求(这会给你带来麻烦)。

    此外,由于头文件中的所有内容都是公开的,inline函数的实现是,根据它们的本质,不可保护的。但是为什么不使用C++,而不使用它们提供的性能优势呢?

最终,分发源文件通常更容易。不是有意冒犯,但正如尼尔所说:如果你还不知道类和文件之间的区别以及如何分发它们,那么你很难赚到大钱。

0

只在头文件中放置完整的类声明,将定义留在.cpp文件中,或者如果您真的很重视它,将类编译为.lib。


0
从你的源代码创建一个共享或静态库,并分发头文件供他人使用你的类。 谁使用你的类必须链接到你的库。

0
最接近您想要的是为Windows创建.dll文件或为Linux创建.so文件,并提供一个lib文件给相关人员。

你也需要头文件。 - Cthutu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接