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 von Event::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 von Event 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 😋 👍