【问题标题】:overloading operator+ constructor issue重载运算符+构造函数问题
【发布时间】:2021-01-28 07:23:39
【问题描述】:

我正在从一本书中学习 C++,我发现引用和运算符重载非常困难。在研究运算符重载时,我不明白为什么如果没有一个以整数作为参数的构造函数,这个程序就无法工作。

#include <iostream>
using namespace std;

class counter {
public:
    counter();
    counter(int value);
    ~counter();
    int getValue() const { return itsValue;  }
    int setValue(int value) { itsValue = value;  }
    counter operator+(const counter&);
private:
    int itsValue;
};
counter::counter() :
    itsValue(0)
{}
counter::counter(int value) :
    itsValue(value)
{}
counter counter::operator+(const counter& rhs) {
    return itsValue + rhs.getValue();
}
int main()
{
    std::cout << "Hello World!\n";
}

我不明白为什么程序在没有这些行的情况下无法运行:

counter(int value);

counter::counter(int value) :
        itsValue(value)
    {}

【问题讨论】:

  • 为什么您认为没有这些行程序将无法运行? (你是对的,它没有,但问题应该显示完整的错误消息)
  • 您还缺少构造函数定义

标签: c++ oop operators


【解决方案1】:

如果你没有这个构造函数:

counter(int value);

那么你不能做这样的事情:

int n = 3;
counter c = counter{n};
counter c = counter{1};
counter c = 2;
// etc ...

您的operator+ 的问题在于,当您将intitsValue + rhs.getValue() 转换为作为返回类型的counter 时,您正在这样做:

counter counter::operator+(const counter& rhs) {
  return itsValue + rhs.getValue();
}

如果没有适当的构造函数,就无法从int 构造counter,并且会出现错误。


您可以选择不提供int 构造函数,方法是手动构造counter 对象并返回:

counter counter::operator+(const counter& rhs) const {
    counter c;
    c.itsValue = itsValue + rhs.getValue();
    return c;
}

注意operator+ 应该是const-qualified。

这是demo


其他一些修复:setValue 应该返回 void。你还没有定义析构函数,但是你已经提供了一个声明。只需删除声明,因为隐式生成的析构函数就足够了。

【讨论】:

  • “这当然需要一个带有 int 的计数器的构造函数”我认为 OP 实际上不明白,我会详细说明这个“当然”
  • @Slava 嗯,不确定要编辑多少,但我试了一下。这样更好吗?
  • 我的意思是 OP 可能不理解/不知道单参数 ctor 可用于类型转换。
  • @Slava 已编辑。现在应该更有帮助了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 2020-12-17
  • 2016-07-21
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
  • 1970-01-01
相关资源
最近更新 更多