2016-05-02 5 views
3

Ich bin selbstlernend C++ als Anfänger, und ich habe einige Probleme in Bezug auf geschachtelte Klassen konfrontiert. Ich habe versucht, eine Klasse für ein Viereck mit vier Ecken zu definieren (definieren Sie einen Punkt namens Scheitelpunkte), der durch ein Objekt einer geschachtelten Klasse für zweidimensionale Punkte dargestellt wird. Ich verwende nur einen Punkt, um meine Antwort zu testen. Meine Antwort auf die Frage lautet:Verschachtelte Klassen Fehler in C++

#include <iostream> 
#include <assert.h> 
using namespace std; 

class quadrangle 
{ 
public: 
    class vertex 
    { 
    private: 
    public: 
     int x, y; 
     friend class quadrangle; 
     vertex(); 
     vertex(int a, int b); 
     vertex(const vertex & old); 
    }; 
    vertex p1; 
    int a, b; 
    friend class vertex; 
    quadrangle(); 
    quadrangle(vertex(int a, int b)) : p1(a,b) {}; 
    quadrangle(const quadrangle & old); 
    void draw(); 

}; 
quadrangle::vertex::vertex() 
{ 
    x = 0; y = 0; 
} 
quadrangle::vertex::vertex(int a, int b) 
{ 

    x = a; y = b; 
} 
void quadrangle::draw() 
{ 
    cout << "p1: (" << p1.x << "," << p1.y << ") " << endl; 
} 
quadrangle::quadrangle() 
{ 
    p1.x = 0; p1.y = 0; 
} 
int main() 
{ 
    quadrangle q1(quadrangle::vertex(2,3)); 
    q1.draw(); 
} 

Irgendwie bekam ich nur

error: no matching function for call to 'quadrangle::quadrangle(quadrangle::vertex)'

und haben einen ganzen Nachmittag stecken. Könnte jemand erklären, was in meinem Code falsch ist? Ich weiß, dass etwas nicht stimmt mit meinem Konstruktor aber ich konnte einfach nicht reparieren ...

+0

Wenn Sie Fragen zu Buildfehlern stellen, fügen Sie bitte die * complete * -Fehlerausgabe ein, einschließlich aller Informationshinweise. Wahrscheinlich enthält die Fehlermeldung alle tatsächlich benötigten Informationen, aber da wir nicht alles sehen können, haben wir nicht alle Informationen. Bitte bearbeiten Sie Ihre Frage so, dass die vollständige Ausgabe vollständig und unbearbeitet, einfach kopiert eingefügt wird. –

+0

Während Sie dabei sind, bitte [Drop das 'mit Namespace std;'] (http://stackoverflow.com/questions/1452721/why-isusing-namespace-std-in-c-sidered-bad- Übung);) – Quentin

+0

leicht offtopic: Warum ist 'Vertex 'eine geschachtelte Klasse von' Viereck'? Würde z.B. Klasse "Dreieck" definiert verschiedene Ecken? – VolkerK

Antwort

3

Ihr Fehler sagen sie alle, Sie haben nicht Konstruktor:

quadrangle(const vertex & old); 

und es ist erforderlich, um diese Initialisierung zu machen:

quadrangle q1(quadrangle::vertex(2,3)); 

Und das ist wirklich seltsam:

quadrangle(vertex(int a, int b)) : p1(a,b) { } 

sieht es wie ein Konstruktor aus, der einen Funktionsprototyp (oder einen Funktionstyp?) Nimmt - aber es ist kein Funktionszeiger, denke ich. p1(a,b) kompiliert nur, weil Sie solche Variablen in Ihrer Klasse haben.

[Bearbeiten]

nach Kommentar von Quentin - oben Erklärung

Function types in a function parameters' declaration decay to pointers

folgende Beispiel zeigt verschiedene Möglichkeiten einen Funktionszeiger ist, können Sie Funktionszeiger als Parameter Funktion schreiben:

std::string bar(int a, int b) { 
    std::cout << "bar"; 
    return ""; 
} 
void foo1(std::string(int a, int b)) { } // Unnamed function pointer 
void foo2(std::string(pf)(int a, int b)) { pf(0,0); } // Named function pointer 
void foo3(std::string(*pf)(int a, int b)) { pf(0,0);} // Named function pointer 

int main() { 
    foo1(bar); 
    foo2(bar); 
    foo3(bar);  
} 
+1

Das Ding in Ihrem zweiten Teil ist in der Tat ein Funktionszeiger. Funktionstypen in der Deklaration von Funktionsparametern werden, ähnlich wie bei Arrays, in Zeiger zerlegt. [Live-Check] (http://coliru.stacked-crooked.com/a/40d2668b9f5c7bdc) – Quentin

+0

@Quentin Ich wusste das nicht, danke – marcinj

6

Folgendes ist nicht das, was Sie erwarten:

quadrangle(vertex(int a, int b)) : p1(a,b) {}; 

es ist ein Konstruktor, die eine Funktion nehmen, die Vertex zurückgibt und 2 int nimmt. und initialisieren Sie dann Elementvertex p1 mit nicht initialisiertem Element a und b.

Was Sie wollen, ist einfach:

quadrangle(const vertex& v) : p1(v) {} 

(Und entfernen Mitglieder a, b).