其他分享
首页 > 其他分享> > 如何编写C getter和setter

如何编写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