2012-04-03 9 views
2

Ah ja "Freund" der am meisten gefürchtete der Schlüsselwörter, nicht ganz objektorientiert, nicht ganz prozedural. Nun, hier macht es wieder Ärger, ich habe jede mögliche Warnung, an die ich denken kann, und der ganze GKK kann mir sagen, dass das Lesen von poly() in diesem Bereich nicht deklariert ist (main.cpp). Kann mir jemand helfen herauszufinden, was ich falsch mache? Ich habe versucht, den Code in Read Poly umzuordnen, aber das hilft nicht, keine anderen Funktionsprototypen scheinen dieses Verhalten ebenfalls zu ändern. Ich weiß nur, dass ich mich selbst schlagen werde, wenn ich herausfinde, was es ist.Ärger mit Freund in C++

//main.cpp 
#include "Polynomial.h" 

int main() 
{ 
Polynomial test = readPoly(); 
} 

//Polynomial.h 
class Polynomial 
{ 
    public : 
    /** creates the zero Polynomial and sets the default output character*/ 
    Polynomial(); 

    /** creates the constant Polynomial c */ 
    Polynomial(int c); 

    /** creates a Polynomial with one term c*x^d */ 
    Polynomial(int c, int d); 

    Polynomial(const Polynomial& toCopy); 



    friend const Polynomial readPoly(); 
    void insert(Term* term); 
} 
//Polynomial.cpp 

const Polynomial readPoly() 
{ 
    cout << "How many terms? "; 
    int termQty = 0; 
    cin >> termQty; 

    int coefficient,degree; 
    Polynomial newPoly; 

    for (int n = 0; n <= termQty; n++) 
    { 
     cin >> coefficient >> degree; 
     newPoly.insert(new Term(coefficient,degree)); 
     newPoly.degreeCached = max(degree, newPoly.degreeCached); 
    } 

    return newPoly; 
} 
+2

kontrastieren Sie objektorientiert mit prozeduralen? – Saintali

+1

Wo wird 'Term' deklariert? –

+0

Ich denke, du solltest 'readPoly()' immer noch außerhalb von 'Polynom' deklarieren, wo' main' davon wissen kann. –

Antwort

3

Ein Freund Erklärung eine Funktion in dem nächsten umschließenden Namespace Umfang existiert erklärt, aber es macht nur die Deklaration innerhalb der Klasse oder über ADL sichtbar. Und da die Funktion keine Argumente hat, die Polynomial verwenden, wird ADL sie nicht finden. Fügen Sie einfach eine Deklaration der Funktion im umgebenden Namensraumbereich hinzu. Oder machen es ein statisches Mitglied, anstatt eine friend — in diesem Fall scheint es besser geeignet (für mich, zumindest). In diesem Fall würden Sie es mit Polynomial::readPoly() (oder nur Polynomial::read() nennen, da die Bereichsauflösung ausdrücklich sagt, was wir lesen). Solche statischen Mitglieder sind wahrscheinlich die üblichste Implementierung der Fabrik Funktionssprache.

+0

Danke, das hat es behoben, und ja, das ist wahrscheinlich passender, aber es ist eine Hausaufgabe, wo das die Spezifikation ist, also werde ich nicht streiten. – awiebe

0

readPoly ist in diesem Bereich tatsächlich nicht deklariert. Fügen Sie in der Kopfzeile eine Funktionsdeklaration hinzu. Die Friend-Klausel sagt nur, dass diese Funktion auf private Member zugreifen kann, aber sie deklariert die Funktion nicht selbst. Also im Wesentlichen wird die Funktion wirklich nicht deklariert.

1

Sieht so aus, als hätten Sie vor der Verwendung readPoly() nicht deklariert. Sie können die Quelle (etwas mehr) neu ordnen, so dass es über main() oder besser scheint es immer noch zu erklären, vor dem Gebrauch:

//Polynomial.h 

class Polynomial 
{ 
.... 
}; 

extern const Polynomial readPoly(); 
+1

Ich glaube, es macht mehr Sinn, die Deklaration in der Kopfzeile zu platzieren, so dass Sie sie nicht überall deklarieren müssen, wo Sie sie brauchen. –

+0

@izomorphius Die Funktion ist kein Mitglied von 'Polymonial' also nicht unbedingt. – trojanfoe

+0

@izomorphius: Wenn auf die Funktion über Transitions-Einheiten zugegriffen werden muss, sollte Ja in der Kopfzeile stehen. –