1

我想知道是否有办法只将受保护和公共的东西放在头文件 .h 中,并将所有私有的东西放在编译单元 .cpp 我需要这个,因为该库将被其他人使用,我不想复制和编辑所有 .h 文件来删除私有声明和实现。我试过但得到了重复的声明错误

另一个问题是关于私有静态的东西我可以在头文件中声明它们并在 .cpp 单元上实现它们吗?我尝试了一个私有变量和一个公共 get 方法,但无法在单元上实现该方法,它仅适用于标头上的声明和实现

[]s,乔

4

5 回答 5

22

处理这个问题的正确方法是实现 pimpl 习惯用法:为所有私有数据创建一个类或结构,并将指向此类对象的指针与前向声明一起放在头文件中。现在从头文件中看不到任何私有数据和方法。

于 2009-10-05T21:05:34.973 回答
5

对此的正确答案是使用 Pimpl (通过指针,正如 Pavel 指出的那样)。Matthew Wilson 的Imperfect C++中还描述了一种疯狂但可能正确的方法,您可以在其中转发声明一个内部结构并在您的类中包含一个不透明的内存块,然后就地构造内部结构(其定义在实现文件)在实现文件的主类构造函数中。

我应该指出,Wilson 在一个附录中展示了这一点,他在其中承认了几个这样的“反对编程的罪行”,作为对试图过于聪明的程序员的警告。他说,我说,你不应该使用这个。但是,如果您有一些压倒一切的严格性能要求,它可能会有一些用处。

于 2009-10-05T21:20:40.123 回答
0

您不能为用户声明完整的类名,而是将类定义放在仅包含公共和私有的 .h 文件中,然后在公共定义的 .cpp 文件子类中,并仅定义私有?

像这样:

.h 文件——

class useThis;   // users actually use this class

class publics {  //this is the interface they see
public:
    int foo;
};

.cpp 文件——

#include "foo.h"

class useThis: publics {

private:
    void add(int b);

};

void useThis::add( int b )
{
    foo+= b;
}
于 2009-10-06T00:09:51.063 回答
0

安德烈亚斯有答案,但请注意,这会使您的代码对自己更加迟钝:

 // header file

 struct hidden_structure;

 class Foo {
     hidden_structure* hidden_data;
 public:
     Foo();
     ~Foo();

     void doStuff();
 };

 // your cpp file

 struct hidden_structure;
     int stuff;
     hidden_structure() : stuff(0) {}
 }

 Foo::Foo() : hidden_data(new hidden_structure) {}
 Foo::~Foo() { delete hidden_data; }

 void Foo::doStuff() { hidden_data->stuff += 34; } // hey, it does a lot of stuff

如您所见,hidden_​​structure 中的数据越多,它就会变得越复杂。

于 2009-10-05T21:11:01.213 回答
0

与约翰的代码相同,但我使用的是指针而不是引用:

// file.h
class TheClass_p;
class TheClass{
  public: 
    TheClass();
    ~TheClass();
  private
    TheClass_p *d;

};

// file.cpp
class TheClass_p {
  int foo;
  float: bar;
};

TheClass::TheClass(){
   d = new TheClass_p;
}

TheClass::~TheClass(){
   delete d;
}

编辑:添加析构函数以释放内存泄漏

于 2009-10-05T21:12:18.280 回答