2015-05-09 67 views
0

我有在头文件和一个类的接口及其在一个单独的源文件执行此代码:隐藏类实现

第一:头文件“Gradebook.h”

#include <string> 

using namespace std; 

class Gradebook{ 
public: 
    Gradebook(string); 
    void setCoursename(string); 
    string getCoursename(); 
    void displayMessage(); 
private: 
    string nameofCourse; 
}; 

第二:“Gradebook.cpp”

#include "stdafx.h" 
#include "Gradebook.h" 
#include <iostream> 

using namespace std; 

Gradebook::Gradebook(string name){ 
    setCoursename(name); 
} 
void Gradebook::setCoursename(string name){ 
    nameofCourse = name; 
} 
string Gradebook::getCoursename(){ 
    return nameofCourse; 
} 
void Gradebook::displayMessage(){ 
    cout << "Display message function shows :" << getCoursename() << endl; 
} 

实现我如何能以仅在其他项目中使用“Gradebook.h”,并隐藏我的实现链接来回这两个单独的文件客户程序员?

+0

您可以将实现预编译为静态或动态加载库。 –

+0

关闭VS项目中的预编译头文件,以便能够删除'stdafx.h'废话。 –

+1

将.cpp编译为一个dll,使用“pimpl idiom”隐藏数据成员和私有方法。 –

回答

2

有几个答案。这将有助于了解你为什么要隐藏实现。这就是你可能想要这样做的原因,我可以想到。

  1. 保护商业秘密:算了。为了能够执行你的代码,计算机必须能够运行它。实际上,通过将代码编译为静态库,可以删除注释,方法名称和变量名称,甚至可以在其上运行混淆器来隐藏控制流(以增加不必要的跳转为代价来减慢它的代价),但最终该代码(或从其生成的机器代码)具有以保持可读性或者不能被执行。

  2. 使用户更容易使用你的代码:如果您有多个源文件,并可能会增加更多的文件,并希望您的客户只是能够在一个文件中去取所有最新的更改,而不必添加单个源文件,将其编译为静态或动态库。然后你可以把图书馆和标题交给他人,他们可以使用它们。

    您还可以创建包含所有其他标题的“伞头”。这样,客户端可以简单地将文件夹的includes文件夹的路径添加到其编译器调用/项目文件中,并包含一个标题,其中包含所有其他标题。如果您添加或拆分标题,则只需更改标题以包含新标题和所有使用它的项目继续工作。

    请注意,使用库会限制您的客户端:他们无法轻松地在调试器中遍历代码,他们无法轻松修复和编译内容。如果他们需要您的代码在新平台上运行,或者想要在编译器中使用不同的优化设置,则他们不能重新编译它。

    另一方面,如果你打算出售你的图书馆,你可能想要坚持你的来源。如果客户没有了源代码,不关心代码的安全性的话,他们可以获得更便宜的版本,如果他们想让其购买任何其他功能,则可以额外收取费用一个版本为编码为他们的新平台等意外依靠实施细则

  3. 阻止客户端:你并不真正需要做的,除了你的代码分成公众的事和私人文件。通常你的实现文件是私有的,你的头文件是公开的,但是你可能有一些内部类的私有头文件。

    由于C++不允许定义和其它语言一样做支持类别类扩展未在头的类声明中声明实例变量或方法,你可能不得不求助于私有实现 (又名'pimpl')模式。

    这通常意味着您声明了一个定义公共API的类,该API只是将指针包装为包含真实实现并实际调用的实际类的指针。它通常只有一个实例变量,pimpl,它是指向另一个类的指针。您只需使用class Foo;前向声明私有类,因此您的客户的代码不知道私有类的任何内容(除非他们明确地查看实现文件或私有头文件,例如,修复错误时)。

  4. 创建一个单一的文件类我提到这最后的,因为它一般是做一个愚蠢的事情,但只是在理论上,你也可以移动实现文件的内容到标题。然后客户端只需要包含头文件并获取所有的源代码。然而,这有很多不利之处,例如使代码难以阅读,减慢编译时间,并要求客户端处理由于包含来自几个.cpp文件的文件而导致的类的重复定义。简而言之:不要这样做。

+0

非常感谢您的帮助 – Moutasem