我正在创建自定义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;
答案 0 :(得分:1)
list
这是operator()
类的非const实例。调用const_cast<const list&>(l)(3); // Explicitly call the const overload
函数时,将使用非常量重载。
{{1}}