正确的签名是为C ++列表类重载`()`getter和setter?

时间:2016-05-28 00:53:12

标签: c++

我正在创建自定义double列表类。我想重载()运算符,以便我可以访问元素并为列表元素赋值。这些函数分别在double中显示返回类型double &list.h。但是,当我运行main.cpp时,您可以看到以下内容,尝试同时使用两者,只调用第二个operator()。我显然误解了一些东西 - 我当前代码中的错误,以及为什么不正确?

  

list.h

#include <iostream>

class list {
    public:
        // Constructor
        list(int length);
        // Destructor
        ~list();
        // Element accessors
        double operator()(int i) const;
        double & operator()(int i);
    private:
        int length;
        double * data;
};

list::list(int length) {
    this->length = length;
    this->data   = new double[length];
}

list::~list() { delete [] this->data; }

double list::operator()(int i) const {
    std::cout << "()1" << std::endl;
    return this->data[i];
}

double & list::operator()(int i) {
    std::cout << "()2" << std::endl;
    return this->data[i];
}
  

的main.cpp

#include <iostream>
#include "list.h"
using namespace std;

int main() {
    list l(3);
    double x;

    // Assign to list element. Should print "()2".
    l(1) = 3;
    // Get list element value. Should print "()1".
    x = l(1);

    return 0;
}

编译完成后,程序会打印:

()2
()2

修改

我的问题出现了,因为我添加了两个功能的顺序,以及我的一些误解。我首先写了一个简单的访问器,即:

double list::operator()(int i);

之后,我尝试添加一个&#34; setter&#34;过载:

double & list::operator()(int i);

此时编译器抱怨道。我在网上搜索,并且在没有真正了解的情况下,在第一个函数之后添加了const关键字。这阻止了编译器的投诉,但后来导致了上面的问题。我的解决方案是消除第一个重载,即删除:

double operator()(int i) const;

1 个答案:

答案 0 :(得分:1)

list

这是operator()类的非const实例。调用const_cast<const list&>(l)(3); // Explicitly call the const overload 函数时,将使用非常量重载。

{{1}}