Warum kann ich das Objekt nicht so aufrufen ?



  • Hallo, ich hätte hier ein Problem mit meinem Aufruf.

    Und zwar habe ich ein objekt erstellt und möchte ihm nun Werte zuweisen über denn Konstruktor was aber nicht so klappt.
    (Keine set Methoden vorhanden, liegt an der Aufgabenstellung)

    Fehlercode "..\myCode\main.cpp:15:5: error: invalid use of 'CEvent::CEvent'"

    int main (void)
    {
    
    	CEvent e1;
    	e1.CEvent(THEATER,"Aida","23.7.14 20:00","Orangerie",500,25.00);
    	cout << "CEvent gestarted." << endl << endl;
    
    	return 0;
    }
    
    CEvent::CEvent(eTypes type, string name, string datetime, string location,
    		unsigned long maxSeats, float pricePerTicket)
    {
    	if(maxSeats<0)
    		m_maxSeats=0;
    	else
    		m_maxSeats=maxSeats;
    	if(pricePerTicket<0.)
    		m_pricePerTicket=0;
    	else
    		m_pricePerTicket=pricePerTicket;
    	m_name=name;
    	m_datetime=datetime;
    	m_location=location;
    	m_type=type;
    	m_bookedSeats=0;
    }
    

    Oder kann ich die werte auch anderes zuweisen ? 🙂


  • Mod

    Korpos schrieb:

    Und zwar habe ich ein objekt erstellt und möchte ihm nun Werte zuweisen über denn Konstruktor was aber nicht so klappt.

    Der Konstruktor dient dazu, das Objekt zu erstellen. Den Konstruktor kannst du daher nicht einfach so nachträglich auf ein existierendes Objekt anwenden. Du bist zu spät dran.

    So geht das:

    CEvent e1(THEATER,"Aida","23.7.14 20:00","Orangerie",500,25.00);
    

    Was mich hier wundert, ist, dass dein Code überhaupt compiliert. Denn in Zeile 4 hast du einen parameterlosen Konstruktor aufgerufen. Aber dieser sollte nicht automatisch erstellt werden, da du bereits selber einen Konstruktor mit Parametern anbietest. Meine Schlussfolgerung: Du musst selber einen parameterlosen Konstruktor definiert haben. Womit sich die Frage aufdrängt: Warum?

    PS: Obligatorischer Hinweis, dass Fließkommazahlen so ungefähr der schlechtestmögliche Datentyp zur Speicherung von Geldbeträgen sind. Sie haben die gegenteiligen Eigenschaften von dem, was Geldbeträge ausmacht. Eine brauchbare Alternative für den Anfang wäre die Benutzung von Ganzzahltypen und dann stellst du dir eben einfach vor, dass die Preise in Cent ausgedrückt sind. Allgemein ist es ein guter Hinweis, nicht von Ähnlichkeiten in der Darstellung (hier: Dezimalzahl mit Komma) auf ähnliche Eigenschaften (hier: Geld ist eine diskrete Größe, Fließkommazahlen eher so etwas wie ein Kontinuum) zu schließen.



  • EDIT: Bitte umbedingt SeppJs Post auch lesen!

    Hier findest du alles was du brauchst:

    enum class Types 
    {
       SomeType,
       SomeOtherType
    }
    
    class Event 
    {
    public:
        // constructor
        Event(Types type, std::string name, std::string dateTime); // more in your case
    
    private:
        Types m_type;
        std::string m_name;
        std::string m_dateTime;
    }
    
    Event::Event(Types type, std::string name, std::string dateTime)
    // Die korrekte Art zu initialisieren:
        : m_type (type)
        , m_name (std::move(name)) // 1 mal kopieren + move für Klassen
        , m_dateTime (std::move(dateTime))
    {
    }
    
    // somewhere else
    int main() // where-ever
    {
        // Eine der Arten ein Objekt zu konstruieren.
        Event event {
            Types::SomeType,
            "Event1",
            "..."
        };
    }
    

    Ich bin gegen dein Type anzeigende Notation. Deshalb einfach mal demonstrativ hier ignoriert 😉



  • Vielen Dank euch beiden, habe es nach SeppJ Post gemacht. Hat alles geklappt 🙂
    Die Datentypen waren vorgeschrieben, aber danke werde ich mir merken.
    Mein Konstruktor hat Default Werte vielleicht deshalb.

    CEvent(eTypes type = NOTYPE,string name = "",string datetime ="",string  location="",unsigned long maxSeats=0, float pricePerTicket=0.0);
    


  • Korpos schrieb:

    Mein Konstruktor hat Default Werte vielleicht deshalb.

    Nicht nur vielleicht. Wenn alle Parameter Default Werte haben kann man den Konstruktor natürlich auch ohne Parameter aufrufen.


  • Mod

    Die Frage, die du dir dabei stellen solltest, ist, ob diese Vorgabewerte sinnvoll sind. Ist das dabei entstehende Objekt sinnvoll einsetzbar? Könnte der Anwender jemals die Absicht haben, ein solches Defaultobjekt zu erstellen?

    Falls eine oder beide Fragen mit Nein beantwortet werden, dann sollten die Defaultparameter entfernt werden.



  • SeppJ schrieb:

    PS: Obligatorischer Hinweis, dass Fließkommazahlen so ungefähr der schlechtestmögliche Datentyp zur Speicherung von Geldbeträgen sind.

    Nicht wenn man mit flüssigem Latinum bezahlt! 😃

    SCNR,
    Finnegan


Anmelden zum Antworten