避免在c++头文件中声明私有字段
本文关键字:声明 字段 文件 c++ | 更新日期: 2023-09-27 18:14:55
当我成为c#爱好者时,我对c++有点失望,因为我相信它的祖先比它的前身更好地解决了我要调用的接口问题。问题是,您无法在类定义中摆脱私有字段声明,因此在其中封装对我来说似乎不那么诚实。例如:
// Righteous.h
#ifndef RIGHTEOUS_H
#define RIGHTEOUS_H
class Righteous
{
public:
void Eat(Food* food);
void Pray(Orison* orison);
void Love(People* person); // by heart, not physically
private:
void WatchHornyVideos(); // oops...
void DoSomethingIllegal(); // hope people will never come here
void DenyGodExistance(); // else I will probably see Him soon
}
#endif
甚至C处理隐藏实现任务更好,因为你可以隐藏它的函数和字段在.c
文件,编译成.lib
和部署头和库而不泄露你的肮脏的秘密。
为了回答这个问题,我想看看从97到现代版本的c++标准是如何解决的。
有两种方法可以进一步将接口与实现分离。抽象接口:
class IRighteous
{
public:
virtual void Eat(Food* food) = 0;
virtual void Pray(Orison* orison) = 0;
virtual void Love(People* person) = 0;
virtual ~IRighteous() {}
};
PIMPL:
class Righteous
{
public:
void Eat(Food* food);
void Pray(Orison* orison);
void Love(People* person);
Righteous(); // To construct RighteousImpl and assign it to the _impl.
~Righteous(); // Destructor needs to be defined in cpp where RighteousImpl is defined or included.
private:
std::unique_ptr<RighteousImpl> _impl;
};