Aufruf einer virtuellen Funktion im Konstruktor



  • Hallo zusammen,

    kann ich in einem Kostruktor eine virtuelle Funktion aufrufen?
    Zu dem Zeitpunkt des Aufrufs innerhalb der Basisklasse wird es ja noch als Objekt
    der Basisklasse behandelt. -> Warnung und es funkt folglich auch nicht
    Gibt es da einen Workaround oder so?

    Ich möchte das Objekt statisch bei Programmstart erzeugen, also bringt mich nen
    Konstruktoraufruf mit anschließendem init nicht weiter.
    Klar kann ich nen Hilfs-Objekt erstellen, das mir dieses Objekt erzeugt und
    die init Methode aufruft, aber geht es auch anders/einfacher?

    Gruß,
    C++ Anfänger



  • C++ Anfänger 🙂 schrieb:

    Hallo zusammen,

    kann ich in einem Kostruktor eine virtuelle Funktion aufrufen?

    klar

    Zu dem Zeitpunkt des Aufrufs innerhalb der Basisklasse wird es ja noch als Objekt
    der Basisklasse behandelt.

    genau

    -> Warnung und es funkt folglich auch nicht

    es "funkt" schon, es wird im ctor A::A die funktion A::f aufgerufen und im ctor B::B die funktion B::f etc. wenn du ein B konstruierst (und B von A abgeleitet ist), wird im ctor von A natürlich NICHT B::f aufgerufen, sondern A::f. der aufruf selbst ist aber erlaubt, solange die funktion nicht gleichzeitig "pure" ist.

    Gibt es da einen Workaround oder so?

    nope. anderes design verwenden. 2 phase construction (igitt) wenns sein muss.

    Ich möchte das Objekt statisch bei Programmstart erzeugen, also bringt mich nen
    Konstruktoraufruf mit anschließendem init nicht weiter.

    hm

    Klar kann ich nen Hilfs-Objekt erstellen, das mir dieses Objekt erzeugt und
    die init Methode aufruft, aber geht es auch anders/einfacher?

    Gruß,
    C++ Anfänger

    nicht dass ich wüsste.
    was willste denn genau machen?

    BTW: "statische objekte" sind sowieso pöse und du solltest gucken dass du ohne sowas auskommt.



  • Hallo,

    ich möche ein Programm schreiben, das auf mehreren Plattformen kompilierbar ist.
    Da ich kein Befürworter von Makros bin, schreibe ich alle eine Basisklasse, die
    unter Windows und Mac OS X kompilierbar ist. Die jeweiligen OS X bzw. Windows
    Klassen schreibe ich einen Ordner, der nur unter dem jeweiligen Betriebssystem
    mitkompiliert wird.

    Jetzt habe ich einen ScreenshotManager.
    Dieser Manager soll dafür verantwortlich sein, dass er neue Objekte der
    Klasse Screenshot erstellt. Hierzu habe ich ein in ScreenshotManager folgendes
    definiert:

    static std::auto_ptr<ScreenshotManager> instance;

    Die Objekterstellung führe ich in der OSX-Datei durch:
    std::auto_ptr<ScreenshotManager> ScreenshotManager::instance(new OSXScreenshotManager());

    -> Projekt nicht kompilierbar, wenn keine plattformabhängige Datei nicht da ist
    (ist aber auch nicht schlimm)

    In dieser init-Funktion möchte ich dann einmal die Bildschirmgröße ermitteln.
    Natürlich kann ich mir vor jedem Screenshot die größen ermitteln, aber das
    finde ich auch nicht so prickelnd ^^

    Gruß,
    C++ Anfänger 🙂



  • Jetzt ist mir gerade beim Mensen aufgefallen, dass ich gar nicht geschrieben habe,
    warum ich die Größen schon im Basiskonstruktor brauche.

    Anhand der Größen reserviere ich mir schon Speicherplatz.

    Ich glaub ich rufe in beiden abgeleiteten Konstruktoren eine Speicherplatz-
    Reservierungsfunktion explizit auf.

    Gruß,
    C++ Anfänger



  • Also da würde ich mir mal nix antun und das einfach so lassen.
    Wenn das was du in der Basisklasse machen könntest viel ist (mehr als 1-2 Zeilen), dann pack es doch in eine Funktion und ruf die Funktion der Basisklasse vom abgeleiteten Ctor auf, nachdem du dort die Grösse festgestellt hast.

    Andrerseits würde ich wohl ursprünglich garkeinen Speicher anfordern und das erst dort machen wo der erste Screenshot gemacht werden soll. Ich denke mal man sollte sowieso immer überprüfen ob sich vielleicht die Auflösung gegenüber dem letzten Screenshot geändert hat - unter Windows zumindest kann man die ja sehr leicht umstellen.


Anmelden zum Antworten