2016-12-02 6 views
0

Ich versuche, zwei einfache Klassen zu erstellen, aber dieser Code wird aus irgendeinem Grund nicht kompiliert. Es heißt, ich rufe point :: point ohne Argumente auf, aber die einzige Zeit, in der ich point :: point anrufe, ist in der Hauptfunktion, und ich rufe sie dort mit Argumenten auf.Warum ruft dieser Konstruktor einen anderen ohne Argumente auf?

Beim Debuggen fand ich den Konstruktor für string_two_points, der den Konstruktor für Punkt aufruft.

#include <iostream> 
#include <string> 
using namespace std; 
class point{ 
public: 
    int x; 
    int y; 
    point(int x, int y): x(x),y(y){}; 
    point(const point & c): x(c.x), y(c.y) {}; 
    }; 

class string_two_points{ 
public: 
    string type; 
    point x; 
    point y; 
    string_two_points(string type, point & xc):type(type){ 
     x=xc; 
    }; 
    string_two_points(string type, point & xc, point & yc):type(type){ 
     x=xc; 
     y=yc; 
    }; 

}; 

int main(){ 
    point a = point(2,3); 
    point b = point(3,4); 
    string_two_points x = string_two_points(string("abc"),a,b); 
    return 0; 
} 
+0

'string_two_points' hat' Punkt x; 'als Mitglied. Wenn Sie also ein 'string_two_points' konstruieren, wird' x' konstruiert, was den Aufruf von 'x's Konstruktor beinhaltet. –

+0

Sie müssen uns sagen, wo der Compiler Beschwerde auftritt. ctors werden oft aus Gründen aufgerufen, die Sie nicht explizit programmiert haben. Sie zeigen zwei Punkte in Punkt. Der Compiler hat wahrscheinlich mehrere andere zur Verfügung gestellt, einschließlich eines Standard-Ctor. –

+0

@ DOUGLASO.MOEN Compiler stellt keinen Standardkonstruktor zur Verfügung, wenn es einen vom Benutzer bereitgestellten Konstruktor gibt –

Antwort

2
string_two_points(string type, point & xc):type(type){ 

Dieser Konstruktor initialisiert wird nicht point y, so dass es standardmäßig durch den Aufruf der Standard-parameterlosen Konstruktor point::point (die nicht existiert) initialisiert wird.

0

Sowohl die Konstrukteure von string_two_points versuchen, den Standardkonstruktor von point für x und y und dann ordnen sie etwas aufzurufen.
Es schlägt fehl, weil point() nicht als Konstruktor vorhanden ist, wie vom Compiler korrekt erwähnt.

0

Seit Klasse string_two_points hat point Mitglieder genannt x und y jede Initialisierung von string_two_points muss eine Initialisierung von x und y umfassen. Da Sie nicht beschreiben, wie sie Elementinitialisierung Listen in der Konstrukteurs zu initialisieren, fügte der Compiler automatisch Standard-Initialisierungen, als ob Sie

string_two_points(string type, point & xc):type(type), x(), y() { 
    x=xc; 
}; 

Note geschrieben hatte x=xc; keine Initialisierung ist es eine Zuordnung ist, die nach dem Fall Initialisierung ist abgeschlossen.

+0

abhängig von den Details der Klasse 'x()' eine Wert-Initialisierung sein könnte kann ein anderes Verhalten als die Standard-Initialisierung haben –

0

Da string_two_points zwei Mitglieder vom Typ point hat und beide Konstruktoren keinen Standardwert haben, muss der Compiler sie initialisieren. Um dies zu tun, versucht es den standardmäßigen, parameterlosen Konstruktor aufzurufen. Da das nicht existiert, erzeugt das einen Fehler.

Sie können das Problem beheben, indem die Mitglieder in jedem Konstruktor initialisiert:

class string_two_points 
{ 
public: 
    string type; 
    point x; 
    point y; 
    string_two_points(string type, point & xc) 
    : type(type), x(xc), y(0, 0) 
    { 
    }; 

    string_two_points(string type, point& xc, point& yc) 
    : type(type), x(xc), y(yc) 
    { 
    }; 
}; 
Verwandte Themen