避免将私有字段声明放入 C++ header
Avoid putting private fields declaration into c++ header
当我成为 C# 爱好者时,我对 C++ 有点失望,因为我相信祖先解决了我调用 接口问题 比它的前辈更好。问题是,你无法摆脱 class 定义中的 private 字段声明,因此它的封装对我来说似乎不太诚实。例如:
// 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
并部署 header 和库,而不会泄露您的脏东西秘密。
C# meta-class 信息很好,尽管现在使用记事本或 emacs 等文本编辑器提取 class 定义不方便。此外,C# 反射工具允许任何人完全反编译 .NET 程序集,因此部署程序集是不安全的,即使是混淆的。
这个问题的回答,我想看看从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;
};
当我成为 C# 爱好者时,我对 C++ 有点失望,因为我相信祖先解决了我调用 接口问题 比它的前辈更好。问题是,你无法摆脱 class 定义中的 private 字段声明,因此它的封装对我来说似乎不太诚实。例如:
// 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
并部署 header 和库,而不会泄露您的脏东西秘密。
C# meta-class 信息很好,尽管现在使用记事本或 emacs 等文本编辑器提取 class 定义不方便。此外,C# 反射工具允许任何人完全反编译 .NET 程序集,因此部署程序集是不安全的,即使是混淆的。
这个问题的回答,我想看看从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;
};