类似于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的最佳解决方案?
简短的回答是不,你不能那样做。
对于可以作为数组访问的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]);
}
};
因此,您可以直接访问成员变量,也可以使用重载的下标运算符。
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();