私人/公共标题示例?

cho*_*_ff 27 c++ header private-header

有人可以举个例子说明公共标题和私有标题是如何工作的吗?我已经在网上做了一些阅读,但我似乎找不到有关示例代码的有用信息.我被告知我应该使用私有标头来分隔我的代码的公共和私有部分,以创建静态库.经过一番阅读后,我对它是如何工作有了一个大概的了解,但我真的很感激一个很好的例子让我开始.具体来说,我不太明白的是如何将接口函数放在我的公共头文件中,私有变量/函数放在我的私有头文件中?谢谢!

编辑:

也许我没有正确处理我的问题,但我的意思是,例如,我有myMath.h和myMath.cpp,而myMath.h有:

class myMath{
public:
    void initialise(double _a, double _b);
    double add();
    double subtract();

private:
    double a;
    double b;
};
Run Code Online (Sandbox Code Playgroud)

myMath.cpp具有函数的实现.我怎样才能使myMath.h只有三个公共函数,而私有变量在另一个文件中定义(例如myMath_i.h),这三个文件就是这样我创建静态库之后用户只需要myMath.h.这也意味着myMath.h不能#include myMath_i.h.所以类似于:

myMath.h:

class myMath{
public:
    void initialise(double _a, double _b);
    double add();
    double subtract();
}
Run Code Online (Sandbox Code Playgroud)

和myMath_i.h:

class myMath{
private:
    double a;
    double b;
}
Run Code Online (Sandbox Code Playgroud)

当然那是不可能的,因为那时我将重新定义myMath类......

ere*_*der 23

您有两个头文件MyClass.h和MyClass_p.h以及一个源文件:MyClass.cpp.

让我们来看看里面的内容:

MyClass_p.h:

// Header Guard Here
class MyClassPrivate
{
public:
    int a;
    bool b;
    //more data members;
}
Run Code Online (Sandbox Code Playgroud)

MyClass.h:

// Header Guard Here
class MyClassPrivate;
class MyClass
{
public:
    MyClass();
    ~MyClass();
    void method1();
    int method2();
private:
    MyClassPrivate* mData;
}
Run Code Online (Sandbox Code Playgroud)

MyClass.cpp:

#include "MyClass.h"
#include "MyClass_p.h"

MyClass::MyClass()
{
    mData = new MyClassPrivate();
}

MyClass::~MyClass()
{
    delete mData;
}

void MyClass::method1()
{
    //do stuff
}

int MyClass::method2()
{
    return stuff;
}
Run Code Online (Sandbox Code Playgroud)

将您的数据保存在MyClassPrivate中并分发MyClass.h.

  • 这不仅提供了公共和私有标头,而且还显示了pImpl习惯用法-为此,有必要使用public / private,但不需要pImpl。 (2认同)
  • 你也可以使用 `std::unique_ptr` 来保存 `MyClassPrivate` 实例。 (2认同)

sha*_*oth 10

您可以在单独的头文件(或一组文件)中声明要向库用户公开的所有接口和常量,并将其放入"inc"子目录 - 这些头将是"public".您还将使用其他头文件来声明您不希望公开的类和内容,因为它们是实现细节 - 您将这些文件放入"src"子目录 - 这些将是"私有".

通过这种方式,用户将被提示他必须仅包含公共标题 - 那些位于"inc"中的标题,并且只有那些标题包含他真正需要的东西,而所有其他标题都是"私有的"并且出于他的兴趣区域,除非他想读入实施.

当您将库作为二进制文件(静态库或动态库)发布时,只复制"inc"内容和编译结果 - 这些对用户来说已经足够了,这样他就看不到您的实现源.