首先非常感谢您提供的线索。
我在尝试完成作业时遇到了一个特别的问题。我很确定命名空间、包含、头文件和所有这些东西有问题,但我真的不知道出了什么问题。
重点是:我需要两个不同的类(比如 Car
和 CarShop
),每个类都必须重载运算符 +。
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/