繁体   English   中英

是否可以覆盖在 C++ 中获取结构成员的默认行为?

[英]Is it possible to override the default behavior of getting a struct member in C++?

类似于 python 中的@property标签,我试图弄清楚是否可以在 C++ 中覆盖 getter 的行为而不必进行函数调用。

基本上,是否可以在 C++ 中执行以下操作:

class vector2(class):
    def __init__(self):
        self.values = [1,2]

    @property
    def x(self):
        return self.values[0]
pos = vector2()
my_var = pos.x

是只编写 getter 和 setter 的最佳解决方案吗?

简短的回答是否定的,你不能那样做。


对于可以作为数组访问的二维向量,我会这样做:

struct Vec2 {
  float x;
  float y;

  const float &operator[](const size_t i) const {
    static_assert(sizeof(Vec2) == 2 * sizeof(float));
    assert(i < 2);
    return (&x)[i];
  }

  float &operator[](const size_t i) {
    return const_cast<float &>(std::as_const(*this)[i]);
  }
};

因此您可以直接访问成员变量或使用重载的下标运算符。

Vec2 v{4, 5};
v.x += 9;
v[1] = -3;

通常,显式调用 getter 和 setter。 我见过很多的命名约定是给 getter 和 setter 相同的名称。

class Foo {
public:
  int member() const {
    return hidden;
  }

  void member(const int value) {
    hidden = value;
  }

private:
  int hidden;
};

这种命名约定使访问非常干净,但仍然清楚地表明正在发生函数调用。

Foo f;
f.member(5);
int five = f.member();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM