我正在将结构转换为类,因此我可以为我的变量强制执行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#的公共只读属性的想法.
编译好,我还没有看到任何问题.
解决方法
存在一个别名问题,因为您公开了对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对象本身的引用,但这可能更难以错过或偶然发生.
并不是说这是反对你正在做的事情的论据.事实上,之前我曾经使用过这种模式(出于不同的原因),除了缺乏封装之外,我认为它本身并没有任何错误,你似乎已经认识到了这一点.上述问题只是需要注意的问题.