initialisierungsliste entfernen?



  • Hallo,

    ich habe einen konstruktor wie folgt (vereinfacht)

    A::
      A()
       :ns1::B(),
        m_apc(GetD(), GetE()),
      { moreCode }
    

    GetD() und GetE sind in der Klasse B definiert, von der meine Klasse ableitet.
    Soweit funktioniert das.

    Jetzt will ich aber beim initialisieren von m_apc anstelle von GetD() einen anderen Wert übergeben, den ich aber erst noch berechnen muss. Wie mach ich das?

    Für B kann ich nicht einfach einen neue Methode einführen oder GetD() anpassen, da ich darauf keinen zugriff hab.

    wenn ich die zuweisung einfach in den Rumpf verlagere, kommt der fehler "kein geeigneter Standardkonstruktor verfügbar"

    Ich denk das ist ein Standardproblem, leider hab ich mit der Suchfunktion ncihts gefudnen, bin dankbar für jede Hilfe!

    das FAQ Thema http://www.c-plusplus.net/forum/viewtopic-var-t-is-259736.html hab ich mir schon angeschaut, bin trotzdem noch nicht weiter 😢

    Stefan


  • Mod

    Du darfst in der Initialisierungsliste auch gerne rechnen oder Funktionen aufrufen. Falls die Klasse von m_apc es erlaubt, nachträglich den Wert zu ändern könntest du alternativ auch zunächst mit Dummy-Parametern initialisieren und dann später die berechneten Werte setzen.

    Beantwortet das deine Frage? Ich bin mir nämlich nicht so sicher, dass ich dich richtig verstanden habe.



  • Das geht auf jeden Fall in die richtige Richtung.

    kann ich in der initalisierungsliste auch funktionen der Klasse aufrufen? aktuell ruf ich ja eine funktion der Oberklasse auf, deren konstruktor ist ja schon durchgelaufen, aber mein eigener konstruktor noch nicht....

    danke schon mal soweit!



  • rewireable schrieb:

    A::
      A()
       :ns1::B(),
        m_apc(GetD(), GetE()),
      { moreCode }
    

    GetD() und GetE sind in der Klasse B definiert, von der meine Klasse ableitet.
    Soweit funktioniert das.

    Solange GetD() und GetB() nicht virtuell sind, ist das kein Problem. Der dynamische Aufruf virtueller Funktionen im Konstruktor oder Destruktor führt allerdings zu undefiniertem Verhalten.

    rewireable schrieb:

    kann ich in der initalisierungsliste auch funktionen der Klasse aufrufen?

    Ja (sowohl freie Funktionen, als auch statische und nicht-statische, nicht-virtuelle Memberfunktionen).


  • Mod

    rewireable schrieb:

    kann ich in der initalisierungsliste auch funktionen der Klasse aufrufen? aktuell ruf ich ja eine funktion der Oberklasse auf, deren konstruktor ist ja schon durchgelaufen, aber mein eigener konstruktor noch nicht....

    Statische Memberfunktionen kannst du problemlos aufrufen.

    Nicht-statische Memberfunktionen kannst du im Prinzip auch aufrufen, aber tu's besser nicht. Du arbeitest dann mit einem Halbfertig erstellten Objekt. Man kann sich zwar genau ausrechnen, wann welche Membervariablen verfügbar sind, jedoch schreit dies geradezu nach Problemen wenn man später mal etwas Ändern will. Man stelle sich vor, jemand anderes ändert später mal die benutzte Funktion und benutzt dabei nicht initialisierte Member, weil er vorher nicht im ganzen Programmcode danach sucht, ob diese Funktion eventuell in einer Initialisierungsliste benutzt wird.

    edit: Ach ja, die Problematik mit virtual habe ich ganz vergessen. Siehe Nexus Beitrag zu dem Thema.


Anmelden zum Antworten