Keine passende Funktion für Aufruf von Konstruktor der Klasse
Ich bin üben meine OOP und ich habe die folgenden Klassen: Punkt und Kreis. Insbesondere Kreis hat einen Mittelpunkt und einen radius. Hier ist der relevante code:
//Point.h
class Point
{
public:
Point(double x, double y);
double x() const;
double y() const;
std::string as_string() const;
private:
double x_coord;
double y_coord;
};
//Circle.h
class Circle
{
public:
Circle(const Point& center, double radius);
Point center() const;
double radius() const;
std::string as_string() const;
std::string equation() const;
private:
Point center_pt;
double radius_size;
};
//Circle.cpp
Circle::Circle(const Point& center, double radius)
{
center_pt = center;
radius_size = radius;
}
Jedoch, wenn ich versuche, um diesen code zu kompilieren, bekomme ich folgende Fehlermeldung:
Circle.cpp: In constructor ‘Circle::Circle(const Point&, double)’:
Circle.cpp:3: error: no matching function for call to ‘Point::Point()’
Point.h:10: note: candidates are: Point::Point(double, double)
Point.h:8: note: Point::Point(const Point&)
Ich bin mir nicht sicher, wie diese zu interpretieren-Fehler. Es sagt mir ich muss die x_coord und y_coord für die Point-parameter in meinem Kreis-Konstruktor?
Explizit definieren Sie einen Standardkonstruktor für die Klasse point.
InformationsquelleAutor nonremovable | 2015-07-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mitglied
center_pt
wird default-initialisiert, und solch eine operation aufrufen, die keine Argumente default-KonstruktorPoint()
. Dies ist jedoch nicht definiert, in derPoint
Klasse und daher gibt Ihnen die Fehlermeldung, die Sie bekam.Bevor Sie zuweisen können
center_pt
hier müssen Sie etwas zuweisen. Der compiler versucht daher standardmäßig initialisierencenter_pt
für Sie zuerst, bevor Sie versuchen zu tun, die Abtretung mitteilt.Statt, wenn Sie die member-Initialisierungsliste Sie können das problem vermeiden, von der Standard-Konstruktion, gefolgt von der Abtretung:
Beim erstellen einer Klasse, die Sie sind im wesentlichen, abgesehen von der Speicher zum speichern der verschiedenen Mitglieder innerhalb der Klasse. Stellen Sie sich also vor
center_pt
undradius_size
als Orte der Erinnerung, dass diese Werte gespeichert werden für jede Instanz der Klasse ist. Wenn Sie eine Klasse erstellen, die Variablen haben, um ihm einige default-Werte, wenn Sie nicht angeben, was Sie bekommen die Standard-Werte konstruiert, was auch immer diese sind. Sie können Werte zuweisen, die später an jene Orte, aber einige wird bei der Initialisierung treten immer an der Zeit, der Klasse, der Schöpfung. Wenn Sie die Initialisierungsliste bekommen Sie explizit angeben, was wird platziert in der Erinnerung das erste mal um.Mithilfe der member-Initialisierungsliste hier Ihre Mitglieder gebaut sind entsprechend das erste mal um. Es hat auch den Vorteil, sparen einige unnötige Operationen.
Wenn Sie eine Klasse erstellen, die Sie sind im wesentlichen, abgesehen von der Speicher zum speichern der verschiedenen Mitglieder innerhalb der Klasse. Stellen Sie sich also vor
center_pt
undradius_size
als Orte der Erinnerung, dass diese Werte gespeichert werden. Wenn das geschieht, wenn Sie eine Klasse erstellen ist, dass diese Variablen haben zu kommen, geben einige default-Werte, wenn Sie nicht angeben, was Sie bekommen die Standard-Werte konstruiert, was auch immer diese sind. Sie können Werte zuweisen, aber später, die erste Standard -, wird immer wieder dort platziert ersten. Wenn Sie die Initialisierungsliste Sie angeben, was platziert in der Erinnerung das erste mal um.Vielen Dank, das macht durchaus Sinn.
Froh, dass es geholfen hat, bearbeitete ich diese in meine Antwort, da ich denke, das ist wirklich wichtig zu verstehen, was Los ist, auf einer tieferen Ebene.
InformationsquelleAutor shuttle87
Ändern Sie den Konstruktor auf folgende Weise
Das problem ist, dass, wenn Sie nicht nennen explizit den Konstruktor mit Parameter für die Klasse
Point
dann der compiler versucht, rufen Sie den Standardkonstruktor der Klasse zu erstellen, Daten Mitgliedcenter_pt
von der Klasse Kreis, bevor Sie Sie zuweisen können, der Punkt innerhalb des Körpers von der Konstruktor der KlasseCircle
. Aber Sie nicht definiert den default-Konstruktor der KlassePoint
und der compiler hat ein Fehler.Den anderen Ansatz ist in der Tat definieren die default-Konstruktor für die Klasse
Point
dass zum Beispiel initilaizes einen Punkt mit Nullen.Berücksichtigen, dass durch die Gestaltung von Klasse
Point
Sie nicht ändern können die Daten der Mitgliedercoord_x
undcoord_y
eines erstellten Objekts.Vielleicht sollte man die Neugestaltung der Klasse.InformationsquelleAutor Vlad from Moscow
Dies ist, weil Sie nicht die Initialisierung der member in der Initialisierungs-Liste, sondern die Zuordnung, um es in den Körper. Folglich ist es zunächst konstruieren Sie mit den Standard-ctor, und folglich wird Ihr compiler Beschwerde.
Betrachten, Dinge zu verändern:
InformationsquelleAutor Ami Tavory
Ändern
zu
So, dass er den Konstruktor, den Sie definiert haben, Punkt. Auch besser für radius als auch
InformationsquelleAutor Ed Heal