【发布时间】:2015-11-20 20:04:53
【问题描述】:
在调试我的程序时,我不断收到以下两个错误:
main.obj : error LNK2005: "class std::basic_istream > & __cdecl operator>>(class std::basic_istream > &,class Complex &)" (??5@YAAAV?$basic_istream@DU?$char_traits @D@std@@@std@@AAV01@AAVComplex@@@Z) 已在 Imaginary.obj 中定义
1>main.obj : error LNK2005: "class std::basic_ostream > & __cdecl operator &,class Complex const &)" (??6@YAAAV?$basic_ostream@DU ?$char_traits@D@std@@@std@@AAV01@ABVComplex@@@Z) 已经在 Imaginary.obj 中定义
我已尝试重新启动我的项目,以确保我创建了一个控制台应用程序,而不是意外创建了其他东西,但这并没有奏效。任何方向将不胜感激。
这是我的代码:
虚构的.h
#ifndef imaginary_h_
#define imaginary_h_
#include <iostream>
class Complex
{
friend std::ostream & operator << (std::ostream& os, const Complex&);
friend std::istream & operator >> (std::istream& is, Complex&);
private:
double real;
double imag;
char op;
public:
double r = real;
double i = imag;
char o = op;
Complex()
{
}
Complex(double r, double i, char o)
{
}
bool userTest();
};
#endif
std::ostream & operator << (std::ostream & os, const Complex & complex)
{
os << complex.r << complex.o << complex.i << "i" << "/n" << "/n";
return os;
}
std::istream & operator >> (std::istream & is, Complex & complex)
{
is >> complex.r >> complex.o >> complex.i;
return is;
}
Imaginary.cpp
#include "imaginary.h"
#include <iostream>
bool Complex::userTest()
{
if (op == '+' || op == '-')
{
return true;
}
else
{
std::cout << "Incorrect operand entry, please enter complex number as x+yi" << "/n" << "/n";
return false;
}
}
main.cpp
#include "imaginary.h"
#include <iostream>
int main()
{
double userInput;
std::cout << "Here you will add or subtract complex numbers." << "/n" << "/n";
do
{
std::cout << "Please enter the real part of you complex number: " << "/n" << "/n";
Complex complex;
std::cin >> complex;
std::cout << "/n" << "/n" << "/n/t" << "Note: Remember to enter your complex number in the format of x+yi to avoid an error";
if (complex.userTest())
{
std::cout << complex << "/n" << "/n";
}
std::cout << "Would you like to perform another complex number operation? " << "/n" << "/n/t";
std::cout << "Choose 1 for Yes and 2 for No" << "/n" << "/n";
std::cin >> userInput;
} while (userInput == 1);
system("pause");
return 0;
}
【问题讨论】:
-
你的文件边界是什么?
operator<<和operator>>定义是否在 header 中? -
请将代码分成文件并修复您的字符串文字(跨越多行)。
-
变量
i和r将只用imag和real的未初始化值初始化一次。如果您想让i和r反映imag和real的变化值,则必须在更新imag和real时更新i和r。那么,为什么要打扰副本呢?如果必须,您可以将i和r声明为imag和r的引用。但是然后问自己为什么需要副本?您是否正在尝试执行 getter 和 setter 功能?同样的原则适用于o和op。 -
您需要在返回之前验证
complex.o变量。例如,您的代码允许这些输入作为有效条目:4M6i、4*6i、4@6i、4z6i。
标签: c++ class operator-overloading complex-numbers