如何编写C getter和setter
作者:互联网
如果我需要为属性编写setter和/或getter,我会这样写:
struct X { /*...*/};
class Foo
{
private:
X x_;
public:
void set_x(X value)
{
x_ = value;
}
X get_x()
{
return x_;
}
};
但是我听说这是编写setter和getter的Java风格,我应该用C风格编写它.此外,我被告知它是无效的,甚至是不正确的.这意味着什么?如何在C中编写setter和getter?
假设需要吸气剂和/或设定器是合理的.例如.也许我们在setter中做了一些检查,或者我们只写了getter.
解决方法:
标准库中有两种不同形式的“属性”,我将其归类为“面向身份”和“面向价值”.您选择哪个取决于系统应如何与Foo交互.两者都不“更正确”.
身份导向
class Foo
{
X x_;
public:
X & x() { return x_; }
const X & x() const { return x_; }
}
这里我们返回对底层X成员的引用,它允许调用站点的两侧观察由另一侧发起的更改. X成员对外界是可见的,大概是因为它的身份很重要.它可能乍一看看起来只有属性的“获取”方面,但如果X是可分配的则不是这种情况.
Foo f;
f.x() = X { ... };
价值导向
class Foo
{
X x_;
public:
X x() const { return x_; }
void x(X x) { x_ = std::move(x); }
}
这里我们返回X成员的副本,并接受要覆盖的副本.任何一方的后期更改都不会传播.据推测,在这种情况下我们只关心x的值.
标签:c,getter-setter 来源: https://codeday.me/bug/20190930/1836664.html