标签: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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。