重载类函数运算符两次作为setter和getter

时间:2014-12-03 08:56:04

标签: c++ function operator-keyword

我有一个类,我想重载fuction-call操作符。但是由于C ++标准禁止声明两个类似的方法只返回类型不同,我得到编译错误C2556。我想将这些函数用作getter和setter方法。我知道我可以通过创建getset函数来实现这一目标。所以问题是:有没有办法以某种方式实现这一目标?

class Foo
{
    private:
        std::vector<int> m_vec;

    public:
        Foo()
        {
            m_vec.push_back(1);
            m_vec.push_back(2);
            m_vec.push_back(3);
        }

        //Getter
        int operator()(int i)
        {
            return m_vec.at(i);
        }

        //Setter (C2556)
        int& operator()(int i)
        {
            return m_vec.at(i);
        }
};

int main()
{
    Foo foo;
    foo(1) = 10; //use the setter 
    int i = foo(1); //use the getter
    return 0;
}

2 个答案:

答案 0 :(得分:7)

解决此问题的传统方法是使用const,例如:

#include <vector>

class Foo
{
    private:
        std::vector<int> m_vec;

    public:
        Foo()
        {
            m_vec.push_back(1);
            m_vec.push_back(2);
            m_vec.push_back(3);
        }

        //Setter
        int& operator()(int i)
        {
            return m_vec.at(i);
        }
        //getter
        int operator()(int i) const
        {
            return m_vec.at(i);
        }
};

int main()
{
    Foo foo;
    foo(1) = 10; //use the setter 
    int i = foo(1); //use the getter
    const Foo& b = foo;
    int j = b(1);
    return 0;
}

现在,当您想要修改而不是修改对象时,编译器将使用“适当”方法。 (如果在const设置中使用Foo,则只需要const运算符)

答案 1 :(得分:0)

据我了解,第一次超载是没有必要的。重载

就足够了
int& operator()(int i)
{
    return m_vec.at(i);
}

然后充当getter和setter。还讨论了该主题here