重载类函数运算符兼任二传手和吸气手

Overload class function operator twice as setter and getter

本文关键字:二传手 类函数 运算符 重载      更新时间:2023-10-16

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

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;
}
解决这个问题

的传统方法是使用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 运算符)

据我了解,第一次重载是不必要的。过载就足够了

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

然后同时用作吸气手和二传手。这里也讨论了这个主题。