C++:在两个不同的类中重载相同的运算符时出现问题

标签 c++ namespaces include operator-overloading

首先非常感谢您提供的线索。

我在尝试完成作业时遇到了一个特别的问题。我很确定命名空间、包含、头文件和所有这些东西有问题,但我真的不知道出了什么问题。

重点是:我需要两个不同的类(比如 CarCarShop),每个类都必须重载运算符 +。

  • Car -> Car &operator+(const Car &c)(应该“添加”两辆车)
  • CarShop -> CarShop &operator+(const Car &c)(应该“添加”汽车到现有的 CarShop)

在文件 CarShop.h 中,我需要 #include "car.h",因为它适用于不同的“汽车”对象。此外,在我的主要测试类中,比方说main.cpp,我还需要#include "car.h"#include "carshop.h"

这里我收到错误消息。 Visual Studio(我们将其用作我们的 IDE)给我“LNK1169 & LNK2005”错误,解释为“同时定义了一个或多个符号”。

有人可以帮帮我吗?我应该怎么做才能避免两个重载运算符之间的冲突?

附言。它们(2 个重载运算符)都被声明为其各自类的友元函数(在 .h 文件中),并在各自的 .cpp 文件中实现。

最佳答案

正如其他人所指出的,您不能只将这些声明为 friend :

Car &operator+(const Car &c);
CarShop &operator+(const Car &c);

即使您可以编译和链接它,它也行不通。而且您不能链接,因为它们具有相同的签名(返回类型不包含在签名中)。你有两个选择:要么有非成员 friend ,要么有成员函数(不需要 friend 声明)。如果你想要非成员(member) friend ,你应该这样声明他们,指定两个操作数:

Car operator+(const Car &c1, const Car &c2);
CarShop operator+(const CarShop &cs, const Car &c);

请注意,正如 James 所指出的,这些运算符不应返回引用。它们根据定义返回新实例。

然而,只有当第一个参数的类型不同于您控制的任何类时,友元运算符才是必需的。例如,如果第一个参数的类型为 std::string 或 int,则有必要声明一个友元运算符。但是,由于这些是您的类,您最好将运算符声明为成员:

Car operator+(const Car &c2); // this is declared inside the Car class
CarShop operator+(const Car &c); // this is declared inside the CarShop class

这里不需要 friend ,因为他们是成员(member)。好吧,严格来说,如果您想访问 Car 的私有(private)成员,您可能希望将 CarShop::operator+(const Car&) 声明为 Car 类中的友元。但是对于 Car::operator+(const Car&) 来说,这是绝对没有必要的。

关于C++:在两个不同的类中重载相同的运算符时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4844163/

相关文章:

c++ - KeyRelease 事件从未发送

发布时 WCF 服务会创建一个带有命名空间的 svc 文件。如何避免命名空间

c++ - C/C++ 中的 Euler 项目 #11

c++ - 错误: use of deleted function 'ClassName::ClassName(const ClassName&)'

php - 如何在 Laravel 中使用子文件夹中的自定义类?

c++ - 工厂方法和循环依赖

c++ - 为什么我在编译期间收到语法错误?

C++ 类的循环依赖(单例)

c++ - 尝试使用 IViewObject::Draw() 将 Web 浏览器控件渲染到 HDC 中在 IE8 中失败,但在 IE11 中成功

r - 从另一个包中调用时,无法从 mgcv 访问 "ldTweedie"函数