发布于2021-10-16 09:29 阅读(374) 评论(0) 点赞(19) 收藏(1)
在暴露库的 C++(或 Java)接口时,必须提供类的“私有”字段,这是不稳定的,因为编译器需要知道类的结构,以便能够进行计算,例如,sizeof()。
但为什么需要这样做以及如何缓解?因为,对我来说,这似乎违反了封装概念:为什么用户会担心或可以访问被认为是私有的东西?
一种解决方案是为每个对象定义一个 size() 函数,但这在运行时会很麻烦。
尽管如此,一种语言 (eC/ecere) 声称 [1]:
“库开发人员无需担心最终用户看到类定义的私有内容,只有声明为公共的内容才会可见”
这是如何在 eC 中实现的,如何在 Java 或 C++ 中实现类似的?
[1] http://www.ecere.com/technologies.html
仅仅因为程序员或编译器可以“看到”一个私有类型,并不意味着它违反了“封装”。将封装视为“合同”(您不应该使用它,但您仍然可以看到它)。
... 然而 ...
如果您真的想“隐藏”底层表示,那么您的问题的答案是使用不透明指针:
这是 C++ 中的一个示例:
http://www.tilander.org/aurora2/Stupid_Cpp_Tricks/index.html
我在 C++ 上购买的早期书籍之一是 James Coplien 的“Acid Book”(正如 Meyers 所说)。今天里面的很多东西都是面包和黄油的东西,虽然你还没有读过,但你应该读。詹姆斯(或吉姆,这个名字多好啊)介绍的其中一件事是 Pimpl idom。Private Implementation 是对这个奇怪名称的愉快解释,指向 implementation 的指针更合理。简单来说,它是一个编译器防火墙,或者是一种有效地向外部隐藏任何类的实现的不透明类型。
// in the header
class Foo
{
public:
Foo();
~Foo();
private:
struct Pimpl; // forward declaration to internal structure
Pimpl* m; // opaque pointer to actual data
};
// in the cpp file
struct Foo::Pimpl
{
std::string name;
};
Foo::Foo()
: m( new Pimpl)
{
}
Foo::~Foo()
{
delete m;
}
作者:黑洞官方问答小能手
链接:http://www.javaheidong.com/blog/article/303946/7fadc40ffc9b0035fc15/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!