运算符重载定义在C++之外
Operator overloading definition outside of the C++
对不起,这是一个如此简单的问题。我一直在使用 tutorialspoint.com 来学习C++。目前,我正在尝试了解类和运算符重载。对于其他会员功能,网站使用此约定
class Box {
private:
int Volume;
public:
Box(int num);
...
}
Box::Box(int num) {
Volume = num;
}
但是,当重载运算符时,他们使用此
class Box {
private:
int volume;
public:
Box(int num);
Box operator+(const Box &b) {
Box box;
box.volume = this->volume + b.volume;
return box;
}
}
它们定义类内的重载函数。是否可以在类外定义它?如果是这样,如何?我试过了
Box Box::operator+(const Box &b) {...}
Box::Box operator+(const Box &b) {...}
但这些不起作用
如何在课外执行此操作?
同样,对不起,这是一个如此简单的问题。谢谢
编辑我的代码看起来像这样
#include <iostream>
#include <string>
using namespace std;
class Box {
private:
int volume;
public:
Box(int num);
Box operator+(const Box &b);
};
Box::Box(int num) {
volume = num;
}
Box Box::operator+(const Box &b) {
Box box;
box.volume = this->volume + b.volume;
return box;
}
int main() {
Box one(2);
Box two;
two = one + one;
}
我的错误是
Overloading.cc: In member function 'Box Box::operator+(const Box&)':
Overloading.cc:18:6: error: no matching function for call to 'Box::Box()'
Overloading.cc:18:6: note: candidates are:
Overloading.cc:13:1: note: Box::Box(int)
Overloading.cc:13:1: note: candidate expects 1 argument, 0 provided
Overloading.cc:5:7: note: Box::Box(const Box&)
Overloading.cc:5:7: note: candidate expects 1 argument, 0 provided
Overloading.cc: In function 'int main()':
Overloading.cc:25:6: error: no matching function for call to 'Box::Box()'
Overloading.cc:25:6: note: candidates are:
Overloading.cc:13:1: note: Box::Box(int)
Overloading.cc:13:1: note: candidate expects 1 argument, 0 provided
Overloading.cc:5:7: note: Box::Box(const Box&)
Overloading.cc:5:7: note: candidate expects 1 argument, 0 provided
是的,尽可能在类之外定义运算符是可能的,而且很常见。你想要这个:
Box operator+( const Box& left, const Box& right ) { ... }
编辑:
如果您的意思是要将运算符声明为成员函数并在其他地方(在 cpp 中)定义它,那么它是:
h
class Box
{
Box operator+( const Box& other ) const;
};
.cpp
Box Box::operator+( const Box& other ) const { ... }
编辑 2:现在您已经发布了错误。 您尝试在创建Box two;
时使用默认构造函数 但是,由于您创建了非默认构造函数Box( int )
因此编译器不会为您生成默认构造函数。
错误消息与
运算符重载无关,它只是抱怨Box
没有默认构造器(即 Box::Box()
) 为语句 Box box;
和 Box two;
。
您可以为其添加默认构造函数,例如:
class Box {
private:
int volume;
public:
Box() : volume(0) {}
~~~~~~~~~~~~~~~~~~~~
Box(int num);
Box operator+(const Box &b);
};
或更改语句以指定参数,例如:
Box box(0);
相关文章:
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 我可以在 C++ 中的函数体之外进行操作吗?
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 如何在模板类之外使用模板参数?
- 通过函数指针定义类范围之外的方法
- 与序列之外的值进行比较
- 我可以在 C++ 中将数据成员/变量从其定义之外添加到结构中吗?
- 为什么除了继承聚合结构之外,结构为空,无法聚合初始化?
- 我可以在 Arduino 的库文件夹之外安装库吗?
- 除了构造函数之外,还创建 QLabel
- 为什么我的变量存在于其范围之外
- 为什么我不能在主函数之外定义一个类的对象(它继承了另一个类)?
- 在模板类之外定义友元函数的正确方法是什么?
- 如何在循环之外重新输入变量
- 在这个无限循环中,当输入 0 时终止,当输入 int 范围之外的任何内容时,程序行为不正常
- 在类 (C++) 之外设置 const int 成员变量
- 在初始化列表之外手动调用基类的构造函数
- 为什么当我尝试搜索双链表中第一个数据条目之外的数据时,程序崩溃了?
- 并行块(线程清理器)之外的 OpenMP 中的争用条件;误报?