从其接口隐藏类实现

Hide class implementation from its interface

本文关键字:实现 隐藏 接口      更新时间:2023-10-16

我在标头文件中的类界面及其在单独的源文件中实现的代码:

首先:标题文件" 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",并将我的实现隐藏在客户端程序器中?

有几个答案。这将有助于知道您为什么实际想隐藏实现。这就是您可能想这样做的原因。

  1. 保护商业秘密:忘记它。为了能够执行您的代码,计算机必须能够运行它。有效地,您可以通过将代码作为静态库来剥离评论,方法名称和可变名称,甚至在其上运行一个offustcator,以掩盖控制流(以添加不需要的跳跃来减慢其降低),但最终代码(或从中生成的机器代码)具有可以保持某种可读性或无法执行的代码。

  2. 使使用代码更容易:如果您有多个源文件,并且可能会添加更多文件,并且您希望您的客户端能够删除一个文件以获取所有文件最新的更改而无需添加单个源文件,将其编译为静态或动态库。然后,您可以将某人赠送库加上标题,他们只能使用它们。

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

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

    另一方面,如果您打算出售图书馆,则可能需要保留您的资源。如果您倒闭的情况下不关心拥有代码的安全性的客户可以在没有源代码的情况下获得更便宜的库版本,那么如果他们想要其他任何功能,您可以通过购买任何其他功能来收取额外的费用 you 为其编码的新平台的版本,等等。

  3. 防止客户不小心依赖实现详细信息:您实际上不需要做任何事情,除了将代码拆分为公共和私人文件。通常,您的实现文件是私人的,您的标题是公开的,但是您可能有一些内部类的私人标题。

    由于C 不允许定义实例变量或标题类声明中未声明的方法,就像其他语言所做的那样支持类别 class Extensions ,您可以必须诉诸私有实施(又称pimpl')模式。

    这通常意味着您要声明一个定义公共API的类,该类仅包含一个指向包含实际实现的实际类并呼吁进行的指针。它通常只有一个实例变量pimpl,即指向另一类的指针。您只需使用class Foo;即可转发私人类,因此您的客户代码对私人类别一无所知(除非他们明确窥视实现文件或私人标头,例如修复错误时。

    <)。
  4. 创建一个单文件类我最后提到这是因为这通常是一件愚蠢的事情,但是就理论而言,您也可以将实现文件的内容移至标题中。然后,客户只需要包括标题并获取所有来源。但是,这具有许多弊端,例如使代码更难读取,减慢编译时间,并要求客户处理由于包括来自几个.cpp文件的文件而引起的类别的重复定义。简而言之:不要这样做。