是否可以覆盖在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++中执行以下操作:是否可以覆盖在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向量,我将执行以
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支持它在一个标志后面。对于这个例子,你将超载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();