2015-10-26 13 views
5

Ich habe eine Header-Datei und eine .cpp-Datei. Ich versuche, eine Präfix- und Postfix-Operator-Überladung zu implementieren, aber ich bekomme diesen Fehler beim Einrichten der Überladung.Überladener 'operator ++' muss ein unärer oder binärer Operator sein (hat 3 Parameter)

fraction.h

#ifndef FRACTION_H 
#define FRACTION_H 

#include <iostream> 

using namespace std; 

class Fraction 
{ 
    public: 
     Fraction(); 
     Fraction(int, int); 
     int getTop() {return m_top;} 
     int getBottom() {return m_bottom;} 
     void set(int t, int b) {m_top=t; m_bottom=b; reduce(); 
     } 

    protected: 
    private: 
     void reduce(); 
     int gcf(int, int); 

     int m_top; 
     int m_bottom; 
}; 

Fraction& operator ++ (Fraction); 
Fraction operator++(Fraction, int); 

#endif 

Main.cpp

#include <iostream> 

using namespace std; 
#include "fraction.h" 

int main { 
    cout << "The fraction is" << f; 
    cout << "The output of ++f is " << (++f) << endl; 
    cout << "The fraction is" << f; 
    cout << "The output of f++ is " << (f++) << endl; 
    cout << "The fraction is" << f; 

    return 0; 
} 

Fraction& Fraction::operator ++ (Fraction){ 
    // Increment prefix 
    m_top += m_bottom; 
    return *this; 
} 

Fraction Fraction::operator ++ (Fraction, int){ 
    //Increment postfix 
} 

Dies sind die beiden Fehler, die ich erhalten:

prefix error: "Parameter of overloaded post-increment operator must have type 'int' (not 'Fraction')" 

postfix error: "Overloaded 'Operator++' must be a unary or binary operator (has 3 parameters)" 

Ist das Präfix Fehler tatsächlich ein Fehler mit meinem ide? Ich weiß, dass es für Post-Inkremente "int" sein muss, aber ich versuche ein Pre-Inkrement zu machen. Ich benutze xcode.

+0

Es gibt mehrere Ausgabe s in deinem Code. Hier sind ein paar, die beheben, die Ihnen die Antwort bekommen könnten. In 'fraction.h' deklarieren Sie eine Klasse namens' fraction', aber die Inkrementoperatoren verwenden eine Klasse namens 'Fraction'. In 'fraction.h' deklarieren Sie Nichtmitgliedsversionen der beiden Operatoren, während Sie in' Main.cpp' Operatoren definieren, die Mitgliedfunktionen der Klasse 'Fraction' sind. In [this] (http://en.cppreference.com/w/cpp/language/operator_incdec) finden Sie Einzelheiten zu den Definitionen der Operatoren innerhalb und außerhalb der Klasse. – crayzeewulf

Antwort

2

Sie erklärt die Betreiber außerhalb der Klasse, die als nicht-Klasse Funktionen

Fraction& operator ++ (Fraction); 
Fraction operator++(Fraction, int); 

aber dann versuchen Sie sie wie Klasse Member-Funktionen

Fraction& Fraction::operator ++ (Fraction){ 
    // Increment prefix 
    m_top += m_bottom; 
    return *this; 
} 

Fraction Fraction::operator ++ (Fraction, int){ 
    //Increment postfix 
} 

Entweder erklären sie als Klassenelementfunktionen definieren

die folgender Weg

class Fraction 
{ 
public: 
    Fraction & operator ++(); 
    Fraction operator ++(int); 
    //... 

Und in diesem Fall die Definition für Beispiel für die Prä-Operator kann wie

Fraction & Fraction::operator ++(){ 
    // Increment prefix 
    m_top += m_bottom; 
    return *this; 
} 

aussehen oder sie als nicht-Klasse Funktion deklarieren, die Freunde der Klasse sind, weil sie den Zugang zu privaten Daten Mitglieder der Klasse

class Fraction 
{ 
public: 
    friend Fraction & operator ++(Fraction &); 
    friend Fraction operator ++(Fraction &, int); 
    //... 

Und haben müssen in diesem Fall kann die Definition zum Beispiel des Prä-Operators aussieht

Fraction & operator ++(Fraction &f){ 
    // Increment prefix 
    f.m_top += f.m_bottom; 
    return f; 
} 
0

Sie erklärt die Funktionen als freie Funktionen

Fraction& operator ++ (Fraction); 
Fraction operator++(Fraction, int); 

aber Sie sie als Elementfunktionen definieren.

Fraction& Fraction::operator ++ (Fraction){ ... } 
Fraction& Fraction::operator ++ (Fraction, int){ ... } 

Da Mitgliederfunktionen haben einen impliziten this Parameter, Ihre Elementfunktionen haben drei Parameter (this, Fraction und int).

Entscheiden Sie, ob die Funktionen frei oder Mitglied sein sollen. Wenn Sie möchten, dass sie frei sind, dann definieren Sie sie als frei und nicht als Mitglied. Wenn Sie möchten, dass sie Mitglied sind, deklarieren Sie sie als Mitglied und passen Sie die Deklarationen wie oben von @crayzeewulf angegeben an.

0

Eine Memberfunktion hat einen impliziten * This-Zeiger, der immer auf das Klassenobjekt zeigt, an dem die Memberfunktion arbeitet. Der Parameter, den wir explizit in der friend -Funktionsversion (die keinen * this-Zeiger hat) auflisten musste, wird zum impliziten * this-Parameter in der Memberfunktionsversion.

Versuchen Sie, es zu einer Nichtmitgliedsfunktion zu machen. Dann können Sie den Parameter übergeben, andernfalls entfernen Sie den Parameter.

-2
int main() { 
    Fraction f; 
    cout << "The fraction is" << f; 
    cout << "The output of ++f is " << (++f) << endl; 
    cout << "The fraction is" << f; 
    cout << "The output of f++ is " << (f++) << endl; 
    cout << "The fraction is" << f; 


    return 0; 
    } 

    Fraction& Fraction::operator++() 
    { 
     // Increment prefix 
     m_top += 1; 
     return *this; 
    } 

    const Fraction Fraction::operator++ (int) 
    { 
     //Increment postfix 
     Fraction temp = *this; 
     ++(*this); 
     return temp; 
    } 

    ostream& operator<<(ostream &os, const Fraction& f) 
    { 
     os << f.m_top << endl; 
     return os; 
    } 

    Fraction::Fraction(const Fraction& f) 
    { 
     m_top = f.m_top; 
     m_bottom = f.m_bottom; 
    } 

    Fraction::Fraction(int t, int b) :m_top(t), m_bottom(b){} 
    Fraction::Fraction() : m_top(1), m_bottom(1){} 


    class Fraction 
    { 
    public: 
     Fraction(); 
     Fraction(int, int); 
     Fraction(const Fraction& f); 
     int getTop() { return m_top; } 
     int getBottom() { return m_bottom; } 
     void set(int t, int b) { 
      m_top = t; m_bottom = b; reduce(); 
     } 
     Fraction& operator ++(); 
     const Fraction operator++(int); 

     friend ostream& operator<<(ostream &os,const Fraction& f); 

     protected: 
     private: 
     void reduce(); 
     int gcf(int, int); 

     int m_top; 
     int m_bottom; 
     }; 
     #endif 
Verwandte Themen