Init Funktion vermeiden



  • Hallo,

    ich habe das Problem, dass ich in meiner Hauptklasse viele Unterklassen habe, sie aber alle im Konstruktor erst mit nullen initialisieren muss, da mir der Device fehlt, den ich aber erst im Konstruktorrumpf meiner Hauptklasse erstelle. Deswegen habe ich bisher für jede Unterklasse eine Init()-Funktion geschrieben, die danach im Konstruktorrumpf der Hauptklasse aufrufe. Kann ich das irgendwie vermeiden, oder muss das sein?



  • Wo ist das Problem? Die Unterklasse ruft doch auch zuerst den Konstruktor der Hauptklasse auf, hat dann das Device und kann den eigenen Konstruktor ausführen.



  • Mit Unterklasse meinte ich hier nicht Vererbung, sondern Komposition.



  • KackPoo schrieb:

    Mit Unterklasse meinte ich hier nicht Vererbung, sondern Komposition.

    Dann mach das Device zum ersten Member und benutze die Initialisiererliste, um den folgenden das erste zu zeigen.



  • Der Device wird so erzeugt

    D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, flags, featureLevels, ARRAYSIZE(featureLevels), D3D11_SDK_VERSION, &sd, &swapchain, &dev, nullptr, &devcon)
    

    Davor muss auch noch das Fenster erstellt werden, dass kann man nur im Konstruktorrumpf machen.



  • Dann bräuchte man eigentlich RAII-Wrapper um Fenster und Device, oder?



  • Wie wärs mit sowas:

    class MyClass
    {
    private:
      static com_ptr<ID3D11Device> createDevice();
    public:
      ...
    }
    
    MyClass::MyClass()
      : device(createDevice())
    {
    }
    


  • dot schrieb:

    Wie wärs mit sowas

    Daran habe ich auch schon gedacht, jedoch werden mit einem Schritt ja Device, DeviceContext und SwapChain erstellt. Wie soll ich das denn regeln?

    volkard schrieb:

    Dann bräuchte man eigentlich RAII-Wrapper um Fenster und Device, oder?

    Wäre eine Möglichkeit, danke.

    @dot:
    Meinst du mit com_ptr das hier?
    Und habe ich das richtig verstanden, dass ich mir dann das Release sparen kann?



  • KackPoo schrieb:

    dot schrieb:

    Wie wärs mit sowas

    Daran habe ich auch schon gedacht, jedoch werden mit einem Schritt ja Device, DeviceContext und SwapChain erstellt. Wie soll ich das denn regeln?

    Niemand zwingt dich Device und SwapChain auf einmal zu erstellen. D3D11CreateDeviceAndSwapChain() ist nur eine Komfortfunktion die das alles auf einmal macht. Verwend einfach D3D11CreateDevice() und erzeug die SwapChain dann selbst. Den DeviceContext bekommst du immer über device->GetImmediateContext().

    KackPoo schrieb:

    Meinst du mit com_ptr das hier?
    Und habe ich das richtig verstanden, dass ich mir dann das Release sparen kann?

    com_ptr ist jetzt meine eigene Klasse aber vom Prinzip ist das genau das gleiche.


  • Mod

    KackPoo schrieb:

    ich habe das Problem, dass ich in meiner Hauptklasse viele Unterklassen habe, sie aber alle im Konstruktor erst mit nullen initialisieren muss, da mir der Device fehlt, den ich aber erst im Konstruktorrumpf meiner Hauptklasse erstelle. Deswegen habe ich bisher für jede Unterklasse eine Init()-Funktion geschrieben, die danach im Konstruktorrumpf der Hauptklasse aufrufe. Kann ich das irgendwie vermeiden, oder muss das sein?

    es besteht doch kein zwang alles in eine klasse stecken zu muessen. das device scheint doch fuer sich selbst vor und nach den anderen objekten zu leben, erstelle das und danach ein composed object mit all den anderen elementen die auf das device zugreifen.


Log in to reply