gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:13:13 25 4
gpt4 key购买 nike

我正在创建自定义 double 列表类。我想重载 () 运算符,以便我既可以访问元素又可以为列表元素赋值。这些函数以返回类型 doubledouble & 出现,分别出现在下面的 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);

之后,我尝试添加一个“setter”重载:

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

此时编译器报错了。我在网上搜索了一下,并没有真正理解,在第一个函数之后添加了一个 const 关键字。这停止了​​编译器的投诉,但随后导致了上述问题。我的解决方案是消除第一个过载,即删除:

double operator()(int i) const;

最佳答案

list l(3);

这是 list 类的非常量实例。调用 operator() 函数时,将使用非常量重载。

const_cast<const list&>(l)(3); // Explicitly call the const overload

关于c++ - 为 C++ 列表类重载 `()` getter 和 setter 的正确签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37494204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com