Anfängerfehler
-
Hallo Experten,
meine Klasse "SensorObject" besitzt eine Klasse "Event".
Die Klasse "Event" erwartet einen Namen (std::string) beim Anlegen.
Es erscheint beim Übersetzen folgende Fehlermeldung:
"no matching function for call to 'Event::Event()' ".
Was mache ich falsch?
Danke für euren Support!
Hier mein Code://******Event.h****** class Event { public: Event(std::string name) : _name(name), current_id_(0) {} ... } //******SensorObject.h****** #include "Event.h" class SensorObject { public: SensorObject(); protected: int _value; Event _evFailsure; //hier Deklaration }; //****** SensorObject.cpp ****** #include "SensorObject.h" SensorObject::SensorObject()// error: no matching function for call to Event::Event()' { _value = 5; _evFailsure("Failsure"); //error: no match for call to '(Event) (const char [9])' }
-
//******Event.h****** #include <string> class Event { private: std::string _name; unsigned current_id_; public: Event(std::string name) : _name{name}, current_id_{0} {} }; //******SensorObject.h****** class SensorObject { public: SensorObject(); protected: int _value; Event _evFailsure; //hier Deklaration }; //****** SensorObject.cpp ****** SensorObject::SensorObject()// error: no matching function for call to Event::Event()' : _value{ 5 }, _evFailsure{ "Failsure" } { }
tut toll.
-
Hallo,
Initialisierungslisten nutzen!
Wenn du die nicht nutzt, macht es der Kompiler selber und nutzt dafür den default-Konstruktor.
-
Ok - danke. Initialisierungslisten verstehe ich.
Aber warum kann ich auch nicht im Konstruktor das Objekt definieren?
-
schnebe schrieb:
SensorObject::SensorObject() { _value = 5; _evFailsure("Failsure"); // das da ... }
... ist kein "Objekt definieren" sondern ein Funktionsaufruf (nein, nicht der Aufruf von
Event::Event(std::string name)
sondern der vonEvent::operator()
).
-
ok - und wann wird dann der Funktionsaufruf Event::Event(std::string name) verwendet?
-
In dem Beispiel von Dir? Bei der Initialisierung in der Initialisierungsliste.
oder auch
Event e{ "Foobar" }; // hier.
Da Dein
Event
keine anderen Konstruktoren hat, immer, wenn eine Instanz vonEvent
zu leben beginnt.
-
schnebe schrieb:
ok - und wann wird dann der Funktionsaufruf Event::Event(std::string name) verwendet?
Wenn du "das da" in die Initialisierungsliste verschiebst, dort gehört das nämlich hin
Alternativ ginge (theoretisch) auch
SensorObject::SensorObject() { _value = 5; _evFailsure = Event("Failsure"); }
aber hier wird das _evFailsure erst mit dem Defaultkonstruktor erstellt, dann wird ein temporäres Objekt erzeugt (mit deinem std::string-Konstruktor) und dnn _evFailsure zugewiesen. Keine sonderlich schöne Lösung.
-
daddy_felix schrieb:
[...] aber hier wird das _evFailsure erst mit dem Defaultkonstruktor erstellt, dann [...]
Den default c-tor hat
Event
nicht.
-
Danke an alle. Bin bei Euch immer gut aufgehoben