这个C const引用访问器接口习惯用法有什么问题吗?

我正在将结构转换为类,因此我可以为我的变量强制执行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对象本身的引用,但这可能更难以错过或偶然发生.

并不是说这是反对你正在做的事情的论据.事实上,之前我曾经使用过这种模式(出于不同的原因),除了缺乏封装之外,我认为它本身并没有任何错误,你似乎已经认识到了这一点.上述问题只是需要注意的问题.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...