我在头文件中有以下代码
class Bar {
public:
void public_foo();
private:
void private_foo();
};
该实现隐藏在源文件
中void Bar::public_foo(){
private_foo();
}
void Bar::private_foo(){
// Some more stuff
}
我想在头文件中看不到私有函数。做这个的最好方式是什么? 我知道两种方式:
1)使private_foo
成为像这样的非成员函数
void private_foo(Bar* this){ /* ... */ }
并在public_foo
中调用它:private_foo(this)
。
这对我来说不是很吸引人,因为它不是特别的OO编程。
2)使用像这样的隐藏实现类
// In header
class Bar {
public:
virtual void public_foo();
virtual ~Bar() { };
};
Bar* CreateBar();
// In Source
class Bar_impl : public Bar {
public:
void public_foo();
private:
void private_foo();
};
Bar* CreateBar(){
return new Bar_impl;
}
void Bar::public_foo(){
private_foo();
}
void Bar::private_foo(){
// Some more stuff
}
这很有效,但对于这么简单的事情来说有点太多了。
是否有第三种(更好)的方法?
编辑:回应@jdehesa,因为我喜欢戴上语言设计师的帽子,这是我理想的语法(不正确的C ++语法,但是人们可以梦想)// In header
class Bar {
public:
void public_foo();
};
// In Source
classdef Bar { // Notice my new "classdef" keyword
public:
void public_foo(){
}
private:
void private_foo(){
}
};
一个问题是,为了正确分配内存,实现类不能添加额外的变量(公共或私有)。
答案 0 :(得分:6)
您可以使用PIMPL惯用语
示例:
// Pimpl idiom - basic idea
class widget {
// :::
private:
struct impl; // things to be hidden go here
impl* pimpl_; // opaque pointer to forward-declared class
};