2010-05-03 7 views
0

Je rencontre des problèmes de surcharge de mon opérateur d'extraction de flux en C++ pour une affectation hw. Je ne suis pas vraiment sûr pourquoi je reçois ces erreurs de compilation que je pensais que je faisais juste ... Voici mon code:surcharge de l'opérateur d'extraction de flux en C++ help

complex.h

#ifndef COMPLEX_H 
#define COMPLEX_H 

class Complex 
{ 
    //friend ostream &operator<<(ostream &output, const Complex &complexObj) const; 
    // note at bottom regarding friend function 
public: 
    Complex(double = 0.0, double = 0.0); // constructor 
    Complex operator+(const Complex &) const; // addition 
    Complex operator-(const Complex &) const; // subtraction 
    void print() const; // output 
private: 
    double real; // real part 
    double imaginary; // imaginary part 
}; 

#endif 

Complex.cpp

#include <iostream> 
#include "Complex.h" 
using namespace std; 

// Constructor 
Complex::Complex(double realPart, double imaginaryPart) : real(realPart), imaginary(imaginaryPart) 
{ 
} 

// addition operator 
Complex Complex::operator+(const Complex &operand2) const 
{ 
    return Complex(real + operand2.real, imaginary + operand2.imaginary); 
} 

// subtraction operator 
Complex Complex::operator-(const Complex &operand2) const 
{ 
    return Complex(real - operand2.real, imaginary - operand2.imaginary); 
} 

// Overload << operator 
ostream &Complex::operator<<(ostream &output, const Complex &complexObj) const 
{ 
    cout << '(' << complexObj.real << ", " << complexObj.imaginary << ')'; 
    return output; // returning output allows chaining 
} 

// display a Complex object in the form: (a, b) 
void Complex::print() const 
{ 
    cout << '(' << real << ", " << imaginary << ')'; 
} 

main.cpp

#include <iostream> 
#include "Complex.h" 
using namespace std; 
int main() 
{ 
    Complex x; 
    Complex y(4.3, 8.2); 
    Complex z(3.3, 1.1); 

    cout << "x: "; 
    x.print(); 
    cout << "\ny: "; 
    y.print(); 
    cout << "\nz: "; 
    z.print(); 

    x = y + z; 
    cout << "\n\nx = y + z: " << endl; 
    x.print(); 
    cout << " = "; 
    y.print(); 
    cout << " + "; 
    z.print(); 

    x = y - z; 
    cout << "\n\nx = y - z: " << endl; 
    x.print(); 
    cout << " = "; 
    y.print(); 
    cout << " - "; 
    z.print(); 
    cout << endl; 
} 

Compile erros:

complex.cpp(23) : error C2039: '<<' : is not a member of 'Complex' 
complex.h(5) : see declaration of 'Complex' 
complex.cpp(24) : error C2270: '<<' : modifiers not allowed on nonmember functions 
complex.cpp(25) : error C2248: 'Complex::real' : cannot access private member declared in class 'Complex' 
complex.h(13) : see declaration of 'Complex::real' 
complex.h(5) : see declaration of 'Complex' 
complex.cpp(25) : error C2248: 'Complex::imaginary' : cannot access private member declared in class 'Complex' 
complex.h(14) : see declaration of 'Complex::imaginary' 
complex.h(5) : see declaration of 'Complex' 

Merci!

Edit:

I wasn't sure about declaring the friend function in the header file or not. When I do, I get these errors: 
c:\documents and settings\wongj\my documents\visual studio 2008\projects\c3_hw\c3_hw4\complex.h(6) : error C2143: syntax error : missing ';' before '&' 
1>c:\documents and settings\wongj\my documents\visual studio 2008\projects\c3_hw\c3_hw4\complex.h(6) : error C2433: 'ostream' : 'friend' not permitted on data declarations 
1>c:\documents and settings\wongj\my documents\visual studio 2008\projects\c3_hw\c3_hw4\complex.h(6) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>c:\documents and settings\wongj\my documents\visual studio 2008\projects\c3_hw\c3_hw4\complex.h(6) : error C2061: syntax error : identifier 'ostream' 
1>c:\documents and settings\wongj\my documents\visual studio 2008\projects\c3_hw\c3_hw4\complex.h(6) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>c:\documents and settings\wongj\my documents\visual studio 2008\projects\c3_hw\c3_hw4\complex.h(6) : error C2805: binary 'operator <<' has too few parameters 
1>c:\documents and settings\wongj\my documents\visual studio 2008\projects\c3_hw\c3_hw4\complex.cpp(23) : error C2872: 'ostream' : ambiguous symbol 
1>  could be 'c:\documents and settings\wongj\my documents\visual studio 2008\projects\c3_hw\c3_hw4\complex.h(6) : int ostream' 
1>  or  'c:\program files\microsoft visual studio 9.0\vc\include\iosfwd(708) : std::ostream' 
1>c:\documents and settings\wongj\my documents\visual studio 2008\projects\c3_hw\c3_hw4\complex.cpp(23) : error C2143: syntax error : missing ';' before '&' 
1>c:\documents and settings\wongj\my documents\visual studio 2008\projects\c3_hw\c3_hw4\complex.cpp(23) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>c:\documents and settings\wongj\my documents\visual studio 2008\projects\c3_hw\c3_hw4\complex.cpp(23) : error C2086: 'int ostream' : redefinition 
1>  c:\documents and settings\wongj\my documents\visual studio 2008\projects\c3_hw\c3_hw4\complex.h(6) : see declaration of 'ostream' 
1>c:\documents and settings\wongj\my documents\visual studio 2008\projects\c3_hw\c3_hw4\complex.cpp(23) : error C2872: 'ostream' : ambiguous symbol 
1>  could be 'c:\documents and settings\wongj\my documents\visual studio 2008\projects\c3_hw\c3_hw4\complex.h(6) : int ostream' 
1>  or  'c:\program files\microsoft visual studio 9.0\vc\include\iosfwd(708) : std::ostream' 
1>c:\documents and settings\wongj\my documents\visual studio 2008\projects\c3_hw\c3_hw4\complex.cpp(23) : error C2872: 'ostream' : ambiguous symbol 
1>  could be 'c:\documents and settings\wongj\my documents\visual studio 2008\projects\c3_hw\c3_hw4\complex.h(6) : int ostream' 
1>  or  'c:\program files\microsoft visual studio 9.0\vc\include\iosfwd(708) : std::ostream' 
1>c:\documents and settings\wongj\my documents\visual studio 2008\projects\c3_hw\c3_hw4\complex.cpp(23) : error C2065: 'output' : undeclared identifier 
1>c:\documents and settings\wongj\my documents\visual studio 2008\projects\c3_hw\c3_hw4\complex.cpp(23) : error C2059: syntax error : 'const' 
1>c:\documents and settings\wongj\my documents\visual studio 2008\projects\c3_hw\c3_hw4\complex.cpp(24) : error C2143: syntax error : missing ';' before '{' 
1>c:\documents and settings\wongj\my documents\visual studio 2008\projects\c3_hw\c3_hw4\complex.cpp(24) : error C2447: '{' : missing function header (old-style formal list?) 
1>Generating Code... 
1>Compiling... 
1>main.cpp 
1>c:\documents and settings\wongj\my documents\visual studio 2008\projects\c3_hw\c3_hw4\complex.h(6) : error C2143: syntax error : missing ';' before '&' 
1>c:\documents and settings\wongj\my documents\visual studio 2008\projects\c3_hw\c3_hw4\complex.h(6) : error C2433: 'ostream' : 'friend' not permitted on data declarations 
1>c:\documents and settings\wongj\my documents\visual studio 2008\projects\c3_hw\c3_hw4\complex.h(6) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>c:\documents and settings\wongj\my documents\visual studio 2008\projects\c3_hw\c3_hw4\complex.h(6) : error C2061: syntax error : identifier 'ostream' 
1>c:\documents and settings\wongj\my documents\visual studio 2008\projects\c3_hw\c3_hw4\complex.h(6) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>c:\documents and settings\wongj\my documents\visual studio 2008\projects\c3_hw\c3_hw4\complex.h(6) : error C2805: binary 'operator <<' has too few parameters 
+0

Vous avez oublié d'ajouter un prototype pour 'ostream & Complex :: operator << (ostream & sortie, const Complex & complexObj) const' à votre définition de classe. –

Répondre

0

Votre déclaration en commentaire dans l'en-tête est presque correcte. Comme il est un ami, ce n'est pas membre et ne peut donc pas être const, il devrait donc être:

friend std::ostream &operator<<(std::ostream &output, const Complex &complexObj); 

Notez également que vous devez qualifier ostream comme std::ostream, puisque vous ne devriez pas utiliser using namespace std; dans un fichier d'en-tête (vous ne devriez vraiment pas besoin de l'utiliser n'importe où, il est généralement préférable d'écrire simplement std:: quand vous voulez utiliser quelque chose de la bibliothèque standard).

De même, dans votre fichier source, car il n'est pas une fonction de membre, vous ne préfixe pas à la définition de l'opérateur avec le nom de la classe, et il devrait être:

std::ostream &operator<<(std::ostream &output, const Complex &complexObj) 
0

Si vous voulez code client d'avoir l'accès à l'opérateur < < surcharge, ajouter

ostream & operator<<(ostream &output, const Complex &complexObj) const 

à votre fichier d'en-tête de classe.

Si, d'autre part, vous ne souhaitez que le code client pour appeler impression(), retirez le

Complex:: 

portée de la définition de l'opérateur dans le fichier de mise en œuvre.