用方法替换成员赋值

时间:2014-08-03 13:36:14

标签: c++

在C ++中生成一些代码后,可能需要将对结构或类成员的访问权限更改为产生一些副作用的内容。从这个意义上讲,我们需要将成员的分配重叠到不同的地方。

Struct A{
int v;
}

int main(){
A a;
a.v=17;
}

是否有可能以某种方式做到这一点? 如果没有可能会如何编写代码以便允许灵活地将成员更改为更多内容?

对于任何合理使用来说,每次访问分为getter和setter的memeber的可能性似乎都很合理且不切实际。

1 个答案:

答案 0 :(得分:2)

是的,使用代理:

struct A
{
    v_proxy v; 
private:
    struct v_proxy
    {
        v_proxy( int vv = 0 ) : v{ vv }
        {}

        //Write access
        v_proxy& operator=( int i )
        {
            //Put your new code here 

            return v = i;
        }

        //Read access
        operator int() const
        {
            return v;
        }

        int v;
    };
};

int main()
{
    A a;

    a.v = 0;
};

编写这样的通用代理以允许以常见的非get / set 语法自定义读/写是很容易的。

编辑:有些人声称这并没有正确模仿C#属性的行为,因为在C#中我们可以从属性中访问this。好的,只需添加对象的引用并将其传递给代理ctor。并且不要忘记让代理课程成为您班级的朋友,为this参考提供完全访问权限:

class A
{
    A() : v{ *this }
    {}

    friend struct v_proxy
    {
        v_proxy( A& ref , int vv = 0 ) : v{ vv } , This{ std::ref( ref )
        {}

        //Write access
        int& operator=( int i )
        {
            //Put your new code here, for example:
            This.foo();

            return v = i;
        }

        //Read access
        operator int() const
        {
            return v;
        }

        int v;

    private:
        std::reference_wrapper<A> This;
    };