我想知道是否有办法只在头文件.h中放置受保护和公共的东西,以及编译单元中的所有私有内容.cpp 我需要这个,因为该库将被其他人使用,我不想复制和编辑所有.h文件以删除私有声明和实现。 我试过但得到了重复声明错误
另一个问题是关于私有静态的东西 我可以在头文件中声明它们并在.cpp单元上实现它们吗? 私有变量和公共get方法 我尝试但无法在单元上实现该方法,它只适用于标头上的声明和实现
[] S, 乔
答案 0 :(得分:22)
处理这个问题的正确方法是实现pimpl习惯用法:为所有私有数据创建一个类或结构,并在头文件中放置一个指向这样一个对象的指针,以及一个前向声明。现在,从头文件中看不到任何私有数据和方法。
答案 1 :(得分:5)
对此的正确答案是使用Pimpl(通过指针,如Pavel指出的那样)。在Matthew Wilson的Imperfect C++中描述了一种疯狂但可能正确的方法,你可以在其中转发声明一个内部结构并在你的类中包含一个不透明的内存块,然后就地构造内部结构(其定义是在实现文件中的实现文件中创建的实现文件中。
我应该指出,威尔逊在附录中表明了这一点,他承认了几个这样的“反编程犯罪”,作为程序员试图过于聪明的一种警告。他说,我说,你不应该使用它。但是,如果你有一些重要的性能要求,它可能可能它可能有用。
答案 2 :(得分:0)
Andreas有答案,但请注意,这会让你的代码对你自己更加迟钝:
// 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中的数据越多,它就越复杂。
答案 3 :(得分:0)
与John的代码相同,但我使用的是指针而不是引用:
// 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;
}
编辑:添加析构函数以释放内存泄漏
答案 4 :(得分:0)
你不能为用户声明完整的类名,但是在.h文件中放置一个只包含公共和私有的类定义,然后在公共定义的.cpp文件子类中,并只定义私有?
像这样:
class useThis; // users actually use this class
class publics { //this is the interface they see
public:
int foo;
};
#include "foo.h"
class useThis: publics {
private:
void add(int b);
};
void useThis::add( int b )
{
foo+= b;
}