我正在将结构转换为类,因此我可以为我的变量强制执行setter接口.
但是,我不想更改读取变量的所有实例.
所以我转换了这个:
但是,我不想更改读取变量的所有实例.
所以我转换了这个:
struct foo_t { int x; float y; };
对此:
class foo_t { int _x; float _y; public: foot_t() : x(_x),y(_y) { set(0,0.0); } const int &x; const float &y; set(int x,float y) { _x = x; _y = y; } };
我对此感兴趣,因为它似乎模仿C#的公共只读属性的想法.
编译好,我还没有看到任何问题.
除了在构造函数中关联const引用的样板外,这个方法的缺点是什么?
有什么奇怪的别名问题吗?
为什么我以前没见过这个成语?
解决方法
存在一个别名问题,因为您公开了对foo_t内部数据的引用,foo_t对象外部的代码可能会在对象的生命周期之外保留对其数据的引用.考虑:
foo_t* f = new foo_t(); const int& x2 = f->x; delete f; std::cout << x2; // Undefined behavior; x2 refers into a foo_t object that was deleted
或者,甚至更简单:
const int& x2 = foo_t().x; std::cout << x2; // Undefined behvior; x2 refers into a foo_t object that no longer exists
这些并不是特别现实的例子,但只要对象公开或返回对其数据(公共或私有)的引用,这就是一个潜在的问题.当然,尽可能在其生命周期之后保持对foo_t对象本身的引用,但这可能更难以错过或偶然发生.
并不是说这是反对你正在做的事情的论据.事实上,之前我曾经使用过这种模式(出于不同的原因),除了缺乏封装之外,我认为它本身并没有任何错误,你似乎已经认识到了这一点.上述问题只是需要注意的问题.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。