我在尝试获取编译任务的代码时遇到问题。我看过类似的问题(即使是那些似乎完全相同的问题),但没有一个解决方案有效。
我的头文件:'complex.h':
#ifndef COMPLEX_H_INCLUDED
#define COMPLEX_H_INCLUDED
#include <iostream>
#include <cstdlib>
using namespace std;
class Complex
{
public:
// Consructors:
Complex();
Complex(double);
Complex(double, double);
// Operational Overloads:
const bool operator == (const Complex&);
const Complex operator + (const Complex&);
const Complex operator + (const double&);
const Complex operator - (const Complex&);
const Complex operator - (const double&);
const Complex operator * (const Complex&);
const Complex operator * (const double&);
friend ostream& operator << (ostream&, const Complex&);
friend istream& operator >> (istream&, Complex&);
private:
double real;
double imaginary;
};
#endif // COMPLEX_H_INCLUDED
我的实现代码'complex.cpp':
#include "complex.h"
#include <iostream>
using namespace std;
/****************************************************************************
* Constructor () *
****************************************************************************/
inline Complex::Complex(){
real = 0;
imaginary = 0;
}
/****************************************************************************
* Constructor (double) *
****************************************************************************/
inline Complex::Complex(double realPart)
:real(realPart)
{
imaginary = 0;
}
/****************************************************************************
* Constructor (double, double) *
****************************************************************************/
inline Complex::Complex(double realPart, double imaginaryPart)
:real(realPart), imaginary(imaginaryPart)
{}
/****************************************************************************
* Operator '==' -- Compares two Complex objects *
* Returns: *
* -- True if their real and imaginary values are equal *
* -- False otherwise *
****************************************************************************/
inline const bool Complex::operator == (const Complex& rhs)
{
return ((this->real == rhs.real) && (this->imaginary == rhs.imaginary));
}
/****************************************************************************
* Operator '+' -- Adds two Complex objects *
* Returns: *
* -- The new Complex object *
****************************************************************************/
inline const Complex Complex::operator + (const Complex& rhs)
{
return (Complex((this->real + rhs.real), (this->imaginary + rhs.imaginary)));
}
/****************************************************************************
* Operator '+' -- Adds a real number to the Complex object *
* Returns: *
* -- The new Complex object *
****************************************************************************/
inline const Complex Complex::operator+(const double& rhs)
{
return Complex((this->real + rhs), this->imaginary);
}
/****************************************************************************
* Operator '-' -- Subtracts the number of another Complex object *
* Returns: *
* -- The new Complex object *
****************************************************************************/
inline const Complex Complex::operator - (const Complex& rhs)
{
return (Complex((this->real - rhs.real), (this->imaginary - rhs.imaginary)));
}
/****************************************************************************
* Operator '-' -- Subtracts a real number from the Complex object *
* Returns: *
* -- The new Complex object *
****************************************************************************/
inline const Complex Complex::operator-(const double& rhs)
{
return Complex((this->real - rhs), this->imaginary);
}
/****************************************************************************
* Operator '*' -- Multiplies together two Complex objects *
* Returns: *
* -- The new Complex object *
****************************************************************************/
inline const Complex Complex::operator * (const Complex& rhs)
{
return (Complex((this->real * rhs.real) - (this->imaginary * rhs.imaginary), (this->real * rhs.imaginary) + (this->imaginary * rhs.real)));
}
/****************************************************************************
* Operator '*' -- Mutltiplies the Complex object by a real number *
* Returns: *
* -- The new Complex object *
****************************************************************************/
inline const Complex Complex::operator * (const double& rhs)
{
return Complex((this->real * rhs), (this->imaginary * rhs));
}
/****************************************************************************
* Operator '<<' -- Outputs the Complex object in a comprehensive format *
* Returns: *
* -- A reference to the ostream *
****************************************************************************/
ostream& operator <<(ostream& out, const Complex& comp)
{
if(comp.real != 0)
{
out << comp.real;
if(comp.imaginary > 0)
out << " + ";
else if (comp.imaginary < 0)
out << " - ";
}
if(comp.imaginary != 0)
out << comp.imaginary << "i";
return out;
}
/****************************************************************************
* Operator '>>' -- Takes in a Complex object from the user *
* Returns: *
* -- A reference to the istream *
****************************************************************************/
istream& operator >>(istream& in, Complex& comp)
{
char sign; //Used to store input when looking for mathematical operators
bool neg = false; //Stores whether or not any input values are <0
// Checks for a negative value for the real
sign = std::cin.peek();
if(sign == '-'){
neg = true;
std::cin.ignore(1,'-');
}
in >> comp.real;
//Negates the real value if necessary
if(neg){
comp.real = -comp.real;
neg = false;
}
//Looks for the + or - operator, accounting for possible variations in whitespacing and hazardous input.
do{
in >> sign;
}while (sign == ' ');
if (sign == '-')
neg = true;
else if (sign != '+'){
cout << "You did not properly format the input of a complex number. \nPlease use the format: 'a+bi' where 'a' is the real number, and 'b' is the imaginary number." << endl;
cout << "The program is currently shutting down.";
exit(EXIT_FAILURE);
}
sign = std::cin.peek();
while(sign == ' ')
in >> sign;
in >> comp.imaginary;
if(neg)
comp.imaginary = -comp.imaginary;
}
实现complex.cpp的最终类:
#include <iostream>
#include "complex.cpp"
using namespace std;
int main()
{
Complex aComplex();
cout << "Please enter a complex number, in the form of 'a+bi', where 'a' is a real number and 'b' the imaginary number." << endl;
cin >> aComplex;
cout << "You entered the value: " << aComplex << endl;
return 0;
}
当我尝试构建代码时,我收到错误:
.../Complex/main.cpp|12|error: ambiguous overload for ‘operator>>’ in ‘std::cin >> aComplex'`
有人有什么想法吗? (我正在使用Code :: Blocks 12.11并使用Ubuntu 13.04,如果有帮助的话。)
答案 0 :(得分:3)
问题是aComplex
被声明为函数!您可能想写下列其中一项:
Complex aComplex;
Complex bComplex = Complex();
Complex cComplex{};
查找“最令人烦恼的解析”,以解释为什么aComplex
是函数声明。
答案 1 :(得分:0)
Complex aComplex();
这不会调用Complex
的构造函数,它会创建一个函数的人,它接受零参数并返回Complex
类型的对象。如果要实例化对象,则应删除空括号:
Complex aComplex;