Problem mit random_shuffle()



  • Der Konstraktor der Klasse initialisiert nur ein paar Member-Variablen...
    Einen Kopier-Konstruktor habe ich eigentlich nicht....

    // Konstruktor - Initialisierungen
    CSprite::CSprite(void)
    {
        m_Rotation = 0;
    
        m_StepX    = 0;
        m_StepY    = 0;
    
        m_Width    = 0;
        m_Height   = 0;
    
        m_AnimationSpeed = 0;
        m_AnimationDelay = 0;
        m_CurrentImage   = 0;
        m_animation = false;
        m_animzaehler = 1;
    
        m_lpDevice = NULL;                  
        m_lpSprite = NULL;
    }
    

    Kann es deshalb also zu Fehlern kommen, weil die Variablen neu gesetzt werden?



  • Hundefutter schrieb:

    Einen Kopier-Konstruktor habe ich eigentlich nicht....

    Wenn das Zeiger sind, solltest du vermutlich einen brauchen 😉

    Hundefutter schrieb:

    m_lpDevice = NULL;                  
        m_lpSprite = NULL;
    


  • // Zeiger auf das Direct3D Device
    LPDIRECT3DDEVICE9 m_lpDevice;
    
    // Zeiger auf das ID3DXSprite-Objekt
    LPD3DXSPRITE m_lpSprite;
    

    Sind also Zeiger...
    Wie muss ich das dann mit dem Kopier-Konstruktor lösen?
    Habe bis jetzt noch nie damit gearbeitet....

    Kann ich den dann auch einfach definieren und der wird dann automatisch bei einem Kopiervorgang aufgerufen, genau wie der Konstruktor beim Erstellen?
    Habe dazu folgenden Syntax gefunden:

    Klassenname(const Klassenname&)

    Ist das so richtig?



  • Naja, habe mich da jetzt ein bisschen eingelesen, weiß also ungefähr, wie der Kopierkonstruktor jetzt funktioniert, also wann er aufgerufen wird, usw..
    Nur wie kann ich den jetzt nutzen, um das oben genannte Problem zu beheben?
    Stehe gerade noch etwas auf dem Schlauch...



  • Das ganze Objekt korrekt kopieren. D.h. keine Flache kopie erstellen. Es sei denn du willst den Speicher auf den gezeigt wird unter den Objekten teilen, in dem Fall wär ein Shared-Pointer ganz nett, da du sonst gefahr läufst dangling pointers zu bekommen.



  • Also muss ich eine sogenannte "deep-copy" erstellen, also muss ich doch einfach den Kopierkonstruktor so definieren, dass in diesem das Objekt per Hand kopiert wird.
    Ist das soweit richtig?



  • Das Device wirst du nicht "deep" kopieren können und auch nicht wollen.
    Das D3DXSPRITE ... keine Ahnung ob man das kopieren kann. Solle man aber wohl ...

    Ich würde eher die Klasse non-copyable machen, und boost::shared_ptr<CSprite> in den vector reinstecken anstelle von CSprite.

    Wenn deine CSprite Klasse wirklich kopierbar sein soll, dann solltest du AddRef() auf das Device aufrufen.



  • Von der Klasse noncopyable habe ich bei meinen Recherchen auch erfahren. Werde es mal damit ausprobieren..
    Danke für die Hilfen!



  • noncopyable ist keine Klasse sondern eine Eigenschaft einer Klasse. Um das zu erreichen, genügt es eigentlich den CopyCtor und den Assignment-operator private zu machen.



  • Braunstein schrieb:

    noncopyable ist keine Klasse sondern eine Eigenschaft einer Klasse. Um das zu erreichen, genügt es eigentlich den CopyCtor und den Assignment-operator private zu machen.

    In der Tat bietet boost eine Klasse mit Namen "noncopyable" an. Also ist es, unter anderem, eine Klasse! 😉



  • David_pb schrieb:

    In der Tat bietet boost eine Klasse mit Namen "noncopyable" an. Also ist es, unter anderem, eine Klasse! 😉

    Genau und der Konstruktor ist auch eine Klasse: class Konstruktor {};



  • Jester schrieb:

    David_pb schrieb:

    In der Tat bietet boost eine Klasse mit Namen "noncopyable" an. Also ist es, unter anderem, eine Klasse! 😉

    Genau und der Konstruktor ist auch eine Klasse: class Konstruktor {};

    Stimmt! 😮



  • class Ihr_seid_doof {} Jawoll;
    


  • Schöne Diskussionen, ob noncopyable eine Klasse ist oder nicht, ich hatte da wirklich eine Klasse noncopyable gemeint, so dass ich diese Klasse erstelle, den Kopierkonstruktur als privat deklariere und dann meinen Klasse von der noncopyable Klasse erben lassen. So verhindere ich dann, dass das Objekt meiner Klasse kopiert werden kann.
    Da in der Basisklasse (noncopyable) dann dieser Kopierkonstruktor deklariert ist, wird vom Compiler bei meiner Klasse kein Kopierkonstruktor mehr erzeugt und der Kopierkonstruktor der Basisklasse kann nicht aufgerufen werden, da er als privat deklariert wurde...
    So eine Klasse ist wie oben schon genannt unter Boost zu finden...
    MfG
    Hundefutter


Anmelden zum Antworten