是否可以覆盖在C+;中获取结构成员的默认行为+;? 类似于Python中的 @属性。但是一般来说,C++中不可能。C++模式是GETER和SETTER。code>int get_x()const{return values[0];}和void set_x(int value){values[0]=value;}对于另一个数组,重载[],这个答案非常酷-使用指向成员的constexpr指针数组并进行查找。优化非常接近内联getter方法的功能:请查看“告诉,不要问”文章。getter和setter只是浪费您的时间,所以只需将使用实例数据的代码放在对象中这看起来不安全。@鬼鬼祟祟地缩短成员的顺序是有保证的,但填充不是。有了正确的断言就可以了。(&x)[1]是迂腐的UB。(x不是数组,只能被视为float[1])。 Foo f; f.member(5); int five = f.member();

是否可以覆盖在C+;中获取结构成员的默认行为+;? 类似于Python中的 @属性。但是一般来说,C++中不可能。C++模式是GETER和SETTER。code>int get_x()const{return values[0];}和void set_x(int value){values[0]=value;}对于另一个数组,重载[],这个答案非常酷-使用指向成员的constexpr指针数组并进行查找。优化非常接近内联getter方法的功能:请查看“告诉,不要问”文章。getter和setter只是浪费您的时间,所以只需将使用实例数据的代码放在对象中这看起来不安全。@鬼鬼祟祟地缩短成员的顺序是有保证的,但填充不是。有了正确的断言就可以了。(&x)[1]是迂腐的UB。(x不是数组,只能被视为float[1])。 Foo f; f.member(5); int five = f.member();,c++,properties,overriding,getter,C++,Properties,Overriding,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是最好的解决方案吗?简单的回答是不,你不能这么做 对于可以作为数组访问的2D向量,我将执行以

基本上,是否可以在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是最好的解决方案吗?

简单的回答是不,你不能这么做


对于可以作为数组访问的2D向量,我将执行以下操作:

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]);
  }
};

通常,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();

你可以用隐式转换来伪装它,但在我看来这不值得。具有转角情况,并且可以抑制优化。最好使用惯用的C++,它只是直接使用方法:MSVC确实为动态属性提供了一个非标准的
declspec
扩展,但g++不支持它。CLAN支持它在一个标志后面。对于这个例子,你将超载 Tale[]]/Cuff>。但是一般来说,C++中不可能。C++模式是GETER和SETTER。code>int get_x()const{return values[0];}和
void set_x(int value){values[0]=value;}
对于另一个数组,重载
[]
,这个答案非常酷-使用指向成员的
constexpr
指针数组并进行查找。优化非常接近内联getter方法的功能:请查看“告诉,不要问”文章。getter和setter只是浪费您的时间,所以只需将使用实例数据的代码放在对象中这看起来不安全。@鬼鬼祟祟地缩短成员的顺序是有保证的,但填充不是。有了正确的断言就可以了。
(&x)[1]
是迂腐的UB。(
x
不是数组,只能被视为
float[1]
)。
Foo f;
f.member(5);
int five = f.member();