c++ - 为什么在调用更复杂的cin和cout时C++ iostream重载失败?

标签 c++ iostream

我的C++类中的IOstream重载遇到问题,下面的代码是我的头文件,因此没有main()。重载的iostream似乎可以用于简单的cin和cout调用,但是当放入更复杂的iostream调用时,它不会与Operato <<和operator >>匹配。

/*
Provide three constructors Complex(a, b), Complex(a), and Complex().  Complex()
creates a Complex object for number 0 and Complex(a) creates a Complex object with 0 for b.
 Also provide the getRealPart() and getImaginaryPart() functions for returning
  the real and imaginary part of the complex number, respectively.
*/
/*
Overload the operators +, -, *, /, +=, -=, *=, /=, [ ], unary + and -, prefix ++ and --,
 postfix ++ and --, <<, >>. Overload the operators +, -, *, / as nonmember functions.
*/
#include <iostream>
#include <sstream>
#include <string>
#include <algorithm>
using namespace std;
class Complex{
  public:
    Complex();
    Complex(double a);
    Complex(double a, double b);
    void set_I(double input);
    void set_R(double input);
    double get_I_comp() const;  //I accessor
    double get_R_comp() const;  // double accessor
    double getRealPart();
    double getImaginaryPart();
    Complex operator+(Complex other);
    Complex operator+(double other);
    Complex operator-(Complex other);
    Complex operator-(double other);
    Complex operator*(Complex other);
    Complex operator*(double other);
    Complex operator/(Complex other);
    Complex operator/(double other);
    void operator++();
    Complex& operator++(int dummy);  
    void operator+=(Complex other);
    void operator+=(double other);
    void operator-=(Complex other);
    void operator-=(double other);
    void operator*=(double other);
    void operator*=(const Complex& other);
    void operator/=(double other);
    void operator/=(const Complex& other);
    void operator- ();
    void operator+ ();
    double& operator[](int index);
    Complex& operator<<(const int& intput);
    Complex& operator>>(const string& output);
    friend ostream& operator<<(ostream& out, Complex& target);
    friend istream& operator>>(const istream& input, Complex& target);

    std::string toString()   //temporary solution right now
    {
      if (this->c_I != 0){
        string ret = std::to_string(c_R);
        ret = ret + " + ";
        ret = ret + std::to_string(c_I);
        ret = ret + " i \n";
        return ret;
      }
      else{
        string ret = std::to_string(c_R);
        return ret;
      }
    }
    Complex& add(double num);
    Complex& add(Complex other);
    Complex& subtract(double num);
    Complex& subtract(Complex other);
    Complex& multiply(double num);
    Complex& multiply(Complex other);
    Complex& divide(double num);
    Complex& divide(Complex other);
    Complex& abs();
  private:
    double c_I;
    double c_R;
};
Complex::Complex() : c_I(0),c_R(0){   //works
}
Complex::Complex(double a) :c_I(0),c_R(a){  //works
}
Complex::Complex(double a, double b){   //works    // at first I have the i as a and r as b, so thats why is fliped
  this->c_I = b;
  this->c_R = a;
}
double Complex::get_I_comp() const{
  return c_I;
}
double Complex::get_R_comp() const{
  return c_R;
}
double Complex::getImaginaryPart(){
  return c_I;
}
double Complex::getRealPart(){
  return c_R;
}
void Complex::set_I(double input){
    c_I = input;
}
void Complex::set_R(double input){
  c_R = input;
}
Complex Complex::operator+(Complex other){
  Complex ret( (this->c_R + other.get_R_comp() ),(this->c_I + other.get_I_comp()));
  return (ret);
}
Complex Complex::operator+(double other){
  Complex ret(this->c_R + other,this->c_I);
  return ret;
}
Complex Complex::operator-(Complex other){
  Complex ret(this->c_R - other.get_R_comp(),this->c_I - other.get_I_comp());
  return ret;
}
Complex Complex::operator-(double other){
  Complex ret(this->c_R - other,this->c_I);
  return ret;
}
Complex Complex::operator*(double other){ 
  Complex ret(this->c_R * other ,this->c_I *other);
  return ret;
}
Complex Complex::operator*(Complex other){
  if((other.get_I_comp() != 0) && (other.get_R_comp() != 0) ){
    Complex ret = other * (this->c_R);
    Complex neu(-(other.get_I_comp()*this->c_I),other.get_R_comp()*this->c_I);
    return (ret + neu);
  }
  if((other.get_I_comp() == 0 ) && (other.get_R_comp() != 0)){
    Complex ret(this->c_R,this->c_I);
    ret = ret * other.get_R_comp();
    return ret;
  }
  else{
    Complex ret((-((this->c_I)*other.get_I_comp())),(this->c_R)*other.get_I_comp());
    return ret;
  }
}
Complex Complex::operator/(double other){
  if (other == 0) {    // zero division error handler
        throw runtime_error("Math error: Can't div by zero\n");
        return 1;
    }
  if(other != 0){
    Complex ret(this->c_R/other,this->c_I/other);
    return ret;
  }
}
//To divide a+bi by c+id we will perform the operation (ac+bd)/(c^2 + d^2) + (bc-ad)/(c^2 + d^2)i.
Complex Complex::operator/(Complex other){   
  if ((other.get_I_comp() != 0) && (other.get_R_comp() != 0)){
    double first = ((this->c_R)*other.get_R_comp() + (this->c_I)*other.get_I_comp())/(other.get_R_comp()*other.get_R_comp() + other.get_R_comp()*other.get_R_comp());
    double second = (this->c_I*other.get_R_comp() + c_R*other.get_I_comp())/(other.get_R_comp()*other.get_R_comp() + other.get_I_comp()*other.get_I_comp());
      Complex ret(first,second);
      return ret;
  }
  if((other.get_I_comp() == 0 ) && (other.get_R_comp() != 0)){
    Complex ret(this->c_R,this->c_I);
    ret = ret *(1/other.get_R_comp());
    return ret;
  }
  else{
    Complex ret(this->c_R,this->c_I);
    Complex neu(1/other.get_I_comp());
    ret = ret * neu;
    return ret;
  }
}
void Complex::operator++(){
    c_R++;
}
Complex& Complex::operator++(int dummy){
    Complex temp = *this;
    ++temp;
    c_R++;
    return temp;
}
void Complex::operator+=(double other){
  c_R += other;
}
void Complex::operator+=(Complex other){
    c_R += other.get_R_comp();
    c_I += other.get_I_comp();
}
void Complex::operator-=(double other){
  c_R +=(-1*other);
}
void Complex::operator-=(Complex other){
    c_R -= other.get_R_comp();
    c_I -= other.get_I_comp();
}
void Complex::operator*=(double other){
    Complex& reference = *this;   //pass by reference editing
    reference = reference* other;
}
void Complex::operator*=(const Complex& rhs){
    Complex& reference = *this;
    reference = reference * rhs;
    }
void Complex::operator/=(double other){
    Complex& reference = *this;
    reference = reference / other;
  }
void Complex::operator/=(const Complex& rhs){
    Complex& reference = *this;
    reference = reference / rhs;
}
double& Complex::operator[](int index){
    if(index <= 1){
    return(index == 0 ? c_R : c_I);
  }
    else{
      throw std::out_of_range ("index outta bound");
    }
}
void Complex::operator-(){
    c_R*=(-1);
    c_I*=(-1);
}
void Complex::operator+(){
    if(c_R<0){
        c_R*=(-1);
    }
    if(c_I<0){
        c_I*=(-1);
    }
}
Complex& Complex::add(double num){
    Complex& reference = *this;
    reference = reference + num;
    return reference;
}
Complex& Complex::add(Complex other){
    Complex& reference = *this;
    reference = reference + other;
    return reference;
}
Complex& Complex::subtract(double num){
    Complex& reference = *this;
    reference = reference - num;
    return reference;
}
Complex& Complex::subtract(Complex other){
    Complex& reference = *this;
    reference = reference - other;
    return reference;
}
Complex& Complex::multiply(double num){
    Complex& reference = *this;
    reference = reference*num;
    return reference;
}
Complex& Complex::multiply(Complex other){
    Complex& reference = *this;
    reference = reference * other;
    return reference;
}
Complex& Complex::divide(double num){
    Complex& reference = *this;
    reference = reference/num;
    return reference;
}
Complex& Complex::divide(Complex other){
    Complex& reference = *this;
    reference = reference/other;
    return reference;
}
Complex& Complex::abs(){
    Complex& reference = *this;
    +reference;
    return reference;
}
ostream& operator<<(ostream& out, Complex& target){
  out << "Real : ";
  out << " " << target.getRealPart();
  out << " imaginary :";
  out <<target.getImaginaryPart();
  return out;
}

istream& operator>>(const istream& input, Complex& target) {
  string use;
  input>>use;
  stringstream convert(use);
  int x = 0;
  convert>>x;
  target.set_R(x);
  return input;
}


进行诸如

    cout << "(" << number1 << ")" << " + " << "(" << number2 << ") = " << (number1 + number2) << endl;

它引发以下异常:
main.cpp:19:69: error: no match for ‘operator<<’ (operand types are ‘std::basic_ostream’ and ‘Complex’)
  cout << "(" << number1 << ")" << " + " << "(" << number2 << ") = " << (number1 + number2) << endl;
In file included from main.cpp:1:0:
Complex.h:276:10: note: candidate: std::ostream& operator<<(std::ostream&, Complex&) 
 ostream& operator<<(ostream& out, Complex& target){

最佳答案

您也必须重载以下功能!

ostream& operator<<(ostream& out, Complex&& target){
  out << "Real : ";
  out << " " << target.getRealPart();
  out << " imaginary :";
  out <<target.getImaginaryPart();
  return out;
}

关于c++ - 为什么在调用更复杂的cin和cout时C++ iostream重载失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61970264/

相关文章:

c++ - 如何在 Raspberry Pi 上使用 OpenCV 和 C++ 加载视频文件?

c++ - 为函数使用特定的默认参数

c++ - 在类中重载 << 运算符

c++ - 使用 ofstream 写入文本文件时断言失败

C++——将流指针作为函数参数给出是什么意思?

c++ - 在可移植应用程序中使用 Windows DLL

c++ - C++中的统一随机数生成器

c++ - C++ 的库路径。失败?

c++ - std::ofstream 是否保证打开新文件时将关闭旧的打开文件?

c++ - fatal error C1075 : end of file found before the left brace and read and write files not working