Methode von Basisklasse wirkt nicht auf abgeleitete Klasse



  • Nope das klappt auch nicht.



  • hustbaer schrieb:

    versuchs mal mit IFace& operator=(IFace<I> const& i)

    glaub ich nicht ^^

    if(i._i)
                    i._i->AddRef();
    

    AddRef wird kaum const sein...

    bb



  • Sieht so aus, als ob das Problem ... und deswegen ist .... Die Sache ist die, dass Vererbung ... unterschiedliche Typen. Du solltest ... Slicing ... nicht const.

    Alles klar?

    Gruß,
    SP



  • Sebastian Pizer schrieb:

    Sieht so aus, als ob das Problem ... und deswegen ist .... Die Sache ist die, dass Vererbung ... unterschiedliche Typen. Du solltest ... Slicing ... nicht const.

    Alles klar?

    Gruß,
    SP

    Ich hab nichts gecheckt. 😕


  • Administrator

    GuardianOfLife schrieb:

    Ich hab nichts gecheckt. 😕

    Das war wohl auch der Zweck. Er hat 50% der Lösung weggelassen, weil du 50% des Problems weggelassen hast. Ich werde jedenfalls aus den wenigen Fetzen Code, welche du uns präsentierst, auch nicht wirklich schlau.

    Grüssli



  • Dravere schrieb:

    GuardianOfLife schrieb:

    Ich hab nichts gecheckt. 😕

    Das war wohl auch der Zweck. Er hat 50% der Lösung weggelassen, weil du 50% des Problems weggelassen hast. Ich werde jedenfalls aus den wenigen Fetzen Code, welche du uns präsentierst, auch nicht wirklich schlau.

    Grüssli

    Na gut ich dacht ich hätte alles gepostet was zur Lösung des Problems wichtig wär aber bitte.

    //DirectDraw.h
    #ifndef DIRECTDRAW_H_INCLUDED
    #define DIRECTDRAW_H_INCLUDED
    
    #include <windows.h>
    #include <assert.h>
    #include "ddraw.h"
    
    namespace Direct
    {
        class Draw
        {
            private:
                IDirectDraw* _pDDraw;
            public:
                Draw();
                ~Draw(){_pDDraw->Release();}
                void SetCoopNormal(HWND);
                IDirectDraw* operator->()const{return _pDDraw;}
        };
        class Draw7
        {
            private:
                IDirectDraw7* _pDDraw7;
            public:
                Draw7();
                ~Draw7(){_pDDraw7->Release();}
                void SetCoopNormal(HWND);
                IDirectDraw7* operator->()const{return _pDDraw7;}
        };
        class Clipper
        {
            private:
                IDirectDrawClipper* _pDDClipper;
            public:
                Clipper();
                void SetHWnd(HWND);
                operator IDirectDrawClipper*()const{return _pDDClipper;}
    
        };
        class SurfaceDesc2
        {
            private:
                DDSURFACEDESC2* _pDDSurfDesc2;
            public:
                SurfaceDesc2();
                ~SurfaceDesc2(){delete _pDDSurfDesc2;}
                operator DDSURFACEDESC2*()const{return _pDDSurfDesc2;}
                DDSURFACEDESC2* operator->()const{return _pDDSurfDesc2;}
                void SetCapabilities(const DWORD& i);
                void SetDimensions(const int&,const int&);
        };
        template<class I>
        class IFace
        {
            protected:
                I* _i;
                IFace():_i(0){}
            public:
                IFace(IFace<I>& i)
                {
                    if(i._i)
                    {
                        i->AddRef();
                        _i=i._i;
                    }
                }
                ~IFace()
                {
                    if(_i)
                        _i->Release();
                }
                IFace& operator=(IFace<I>& i)
                {
                    if(i._i)
                        i._i->AddRef();
                    if(_i)
                        _i->Release();
                    _i=i._i;
                    return *this;
                }
                IFace* operator->()const{return _i;}
                operator I*()const{return _i;}
        };
        class Surface7:public IFace<IDirectDrawSurface7>
        {
            protected:
                void Lock(SurfaceDesc2&);
                void Unlock();
            public:
                Surface7(){}
                void GetDesc2(SurfaceDesc2&)const;
                void SetClipper(Clipper&);
                void BltFrom(Surface7&,RECT*,RECT*);
                void Fill(COLORREF);
                void LoadBitmap(const char*);
        };
        class PrimarySurf7:public Surface7
        {
            public:
                PrimarySurf7(){}
                PrimarySurf7(Draw7& draw){Init(draw);}
                void Init(Draw7&);
        };
        class OffScreenSurf7:public Surface7
        {
            public:
                OffScreenSurf7(){}
                OffScreenSurf7(Draw7& draw,const int& width,const int& height){Init(draw,width,height);}
                void Init(Draw7&,const int&,const int&);
        };
    }
    
    #include "DirectDraw.cpp"
    
    #endif // DIRECTDRAW7_H_INCLUDED
    
    //DirectDraw.cpp
    using namespace Direct;
    
    Draw::Draw()
    {
        if(DirectDrawCreate(0,&_pDDraw,0)!=DD_OK)
            throw "Cannot create DirectDraw object";
    }
    
    void Draw::SetCoopNormal(HWND hWnd)
    {
        if(_pDDraw->SetCooperativeLevel(hWnd,DDSCL_NORMAL)!=DD_OK)
            throw "Cannot set normal cooperative level";
    }
    
    Draw7::Draw7()
    {
        Draw ddraw;
        if(ddraw->QueryInterface(IID_IDirectDraw7,(void**)&_pDDraw7)!=DD_OK)
            throw "Cannot query interface to DirectDraw7";
    }
    
    void Draw7::SetCoopNormal(HWND hWnd)
    {
        if(_pDDraw7->SetCooperativeLevel(hWnd,DDSCL_NORMAL)!=DD_OK)
            throw "Cannot set normal cooperative level";
    }
    
    Clipper::Clipper()
    {
        Draw7 ddraw7;
        if(ddraw7->CreateClipper(0,&_pDDClipper,0)!=DD_OK)
            throw "Cannot create Clipper";
    }
    
    void Clipper::SetHWnd(HWND hWnd)
    {
        if(_pDDClipper->SetHWnd(0,hWnd)!=DD_OK)
            throw "Cannot set handle window to clipper";
    }
    
    SurfaceDesc2::SurfaceDesc2()
    {
        _pDDSurfDesc2=new DDSURFACEDESC2;
        memset(_pDDSurfDesc2,0,sizeof(DDSURFACEDESC2));
    }
    
    void SurfaceDesc2::SetCapabilities(const DWORD& caps)
    {
        _pDDSurfDesc2->dwSize=sizeof(DDSURFACEDESC2);
        _pDDSurfDesc2->dwFlags=DDSD_CAPS;
        _pDDSurfDesc2->ddsCaps.dwCaps=caps;
        _pDDSurfDesc2->ddsCaps.dwCaps2=0;
    }
    
    void SurfaceDesc2::SetDimensions(const int& width,const int& height)
    {
        _pDDSurfDesc2->dwSize=sizeof(DDSURFACEDESC2);
        _pDDSurfDesc2->dwFlags=DDSD_WIDTH|DDSD_HEIGHT;
        _pDDSurfDesc2->dwWidth=width;
        _pDDSurfDesc2->dwHeight=height;
    }
    
    void Surface7::Lock(SurfaceDesc2& surfDesc2)
    {
        assert(_i!=0);
        if(_i->Lock(0,surfDesc2,DDLOCK_WAIT,0)!=DD_OK)
            throw "Cannot lock surface";
    }
    
    void Surface7::Unlock()
    {
        assert(_i!=0);
        _i->Unlock(0);
    }
    
    void Surface7::GetDesc2(SurfaceDesc2& surfDesc2)const
    {
        assert(_i!=0);
        if(_i->GetSurfaceDesc(surfDesc2)!=DD_OK)
            throw "Cannot get surface description";
    }
    
    void Surface7::SetClipper(Clipper& clipper)
    {
        assert(_i!=0);
        if(_i->SetClipper(clipper)!=DD_OK)
            throw "Cannot set clipper to surface";
    }
    
    void Surface7::BltFrom(Surface7& surface7,RECT* dRect=0,RECT* sRect=0)
    {
        assert(_i!=DD_OK);
        if(_i->Blt(dRect,surface7._i,sRect,DDBLT_WAIT,0)!=DD_OK)
            throw "Cannot perform a blitt";
    }
    
    void Surface7::Fill(COLORREF color)
    {
        SurfaceDesc2 surfDesc2;
        Lock(surfDesc2);
            for(unsigned int dy=0;dy<surfDesc2->dwHeight;++dy);
            {
                BYTE* pByte=(BYTE*)surfDesc2->lpSurface;
                for(unsigned int dx=0;dx<surfDesc2->dwWidth;++dx,++pByte)
                    *pByte=color;
                pByte+=surfDesc2->lPitch-surfDesc2->dwHeight;
            }
        Unlock();
    }
    
    void Surface7::LoadBitmap(const char* pFileName)
    {
        assert(_i!=0);
        HBITMAP hBm=(HBITMAP)LoadImage(0,pFileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
        if(hBm==0)
            throw "Cannot load picture from file";
        BITMAP bm;
        GetObject(hBm,sizeof(BITMAP),&bm);
        SurfaceDesc2 surfDesc2;
        surfDesc2.SetCapabilities(DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY);
        surfDesc2.SetDimensions(bm.bmWidth,bm.bmHeight);
        HDC hDCPic=CreateCompatibleDC(0),hDCSurf;
        SelectObject(hDCPic,hBm);
        if(_i->GetDC(&hDCSurf)!=DD_OK)
        {
            DeleteDC(hDCPic);
            DeleteObject(hBm);
            throw "Cannot load device-context from surface";
        }
        BitBlt(hDCSurf,0,0,bm.bmWidth,bm.bmHeight,hDCPic,0,0,SRCCOPY);
        _i->ReleaseDC(hDCSurf);
        DeleteDC(hDCPic);
        DeleteObject(hBm);
    }
    
    void PrimarySurf7::Init(Draw7& draw7)
    {
        SurfaceDesc2 surfDesc2;
        surfDesc2.SetCapabilities(DDSCAPS_PRIMARYSURFACE|DDSCAPS_VIDEOMEMORY);
        if(draw7->CreateSurface(surfDesc2,&_i,0)!=DD_OK)
            throw "Cannot create primary surface";
    }
    
    void OffScreenSurf7::Init(Draw7& draw7,const int& width,const int& height)
    {
        SurfaceDesc2 surfDesc2;
        surfDesc2.SetCapabilities(DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY);
        surfDesc2.SetDimensions(width,height);
        if(draw7->CreateSurface(surfDesc2,&_i,0)!=DD_OK)
            throw "Cannot create off-screen surface";
    }
    
    //View.h
    #ifndef VIEW_H_INCLUDED
    #define VIEW_H_INCLUDED
    
    #include <windows.h>
    #include "DirectDraw.h"
    
    class View
    {
        private:
            Direct::Draw7 _draw;
            Direct::Surface7 _bufferSurf;
        public:
            View(){}
            View(HWND hWnd){Create(hWnd);}
            void Create(HWND hWnd){_draw.SetCoopNormal(hWnd);}
            void SetSize(const int&,const int&);
    };
    
    #endif // VIEW_H_INCLUDED
    
    //View.cpp
    #include "View.h"
    
    void View::SetSize(const int& width,const int& height)
    {
        if(width!=0 && height!=0)
            _bufferSurf=Direct::OffScreenSurf7(_draw,width,height);
    }
    

  • Administrator

    GuardianOfLife schrieb:

    Na gut ich dacht ich hätte alles gepostet was zur Lösung des Problems wichtig wär aber bitte.

    Jetzt hast du einfach 1000000% angeben, das ist auch nicht sehr sinnvoll. Ist es denn so schwer, sowas sinnvoll zusammenzufassen?

    Ich meine was haben wir von deinem ersten Code?

    _bufferSurf=Direct::OffScreenSurf7(_draw,width,height);
    

    Ok, was ist _bufferSurf? Was ist Direct::OffSceenSurf7? Was ist _draw? Was ist width? Was ist height? Ist das ein Konstruktoraufruf? Eine Funktion? Was kommt zurück? Diese Zeile sagt 0 aus.

    Danach gibst du an:

    Surface7=OffScreenSurface7(_draw,width,height);
    

    Dise Zeile stimmt nicht mal mit der anderen Zeile überein. Was soll das? ist das eine andere? Was ist OffScreenSurface7 hier? Was ist Surface7? Was ist _draw? Was ist width? Was ist height? Ist das eine Konstruktoraufruf? Eine Funktion? Was kommt zurück? Wieder eine Zeile die uns nichts sagt.

    Danach kommt die Fehlermeldung, mit welcher wir auch ziemlich wenig anfangen können, weil sie meiner Meinung nach nicht einmal vollständig ist. Und mit den zu wenigen Informationen die du uns gibst, ist sie erst recht schwer zu verstehen, da hier anscheinend einiges an Makromagie angewandt wird.

    Auch deine eigene Problembeschreibung ist extrem mikrig. Was erwartest du? Was sollte passieren? Sei ein wenig ausführlicher mit der Beschreibung. Wieso glaubst du, dass es hier funktionieren soll?

    Und ich werde mir jetzt auch nicht den ellenlangen Code anschauen. Du solltest lernen das Problem korrekt zu beschreiben und auf die wirklich nötigen Informationen zu reduzieren. Das hilft nämlich auch dir bei der Fehlersuche. Wenn man das Problem richtig eingrenzt, fällt einem die Lösung manchmal plötzlich selber ein.

    Grüssli



  • Siehe Du brauchst Hilfe?. Punkt 6 bedeutet nicht, dass Du "..." überall einfügen sollst. Du lässt dann wichtige Informationen weg, die andere gebrauchen können, Dir zu helfen. Trotzdem will keiner hier 300 Zeilen Code lesen. Wenn Du Dein Problem gelösen haben möchtest, musst Du Dir schon etwas Mühe geben, das Problem zu isolieren und dann ein vollständiges aber kurzes Programm zeigen, was Deiner Meinung nach kompilieren sollte, oder sich nicht so verhält, die Du es erwartest. Ich schätze, Du hast ein Problem mit der Sprache C++ und weniger mit DirectX. Versuch das ganze mal zu kürzen und den DirectX-Kram rauszuschmeißen. Punkt 7 sollte man auch nicht unterschätzen.

    Gruß,
    SP



  • Hey ich weis echt nicht was ihr von mir wollt schaut euch den aller ersten Code an, da steht alles was ich ihr wissen müsst.

    //DirectDraw.h
    template<class I>
    class IFace
    {
        protected:
            I* _i;
            IFace():_i(0){}
        public:
            ...
            IFace& operator=(IFace<I>& i)
            {
                if(i._i)
                    i._i->AddRef();
                if(_i)
                    _i->Release();
                _i=i._i;
                return *this;
            }
            ...
    };
    
    class Surface7:public IFace<IDirectDrawSurface7>
    {
        ...
    };
    
    class OffScreenSurface7:public Surface7
    {
        ...
    };
    
    [cpp]//View.cpp
    ...
    _bufferSurf=Direct::OffScreenSurf7(_draw,width,height);
    //_bufferSurf ist ein Object von Surface7
    //und das andere ist ja wohl logisch!
    //Beide hab ich ganz normal mit einem Konstruktor erzeugt
    //Die Vererbung kann man auch gut sehen Surface7 erbt von IFace
    //und OffScreenSurface7 erbt von Surface7 und somit auch von IFace
    //Jetzt soll die operation = ausgeführt werden, die in IFace definiert ist.
    //Jedoch meldet der Compiler das es keine übereinstimmende Methode dafür gibt,
    //was ich auch aufgelistet habe.
    ...
    

    Mein Problem hab ich unten deutlich geschildert!
    Die Ausgabe des Compilers ist auch da!
    Das Problem ist ganz klar zu erkennen!
    Ich habe alle nötigen Informationen gepostet!
    Alles was ich weg gelassen habe ist ohne belang oder wollt ihr wissen was der Konstruktor erzeugt? Ok ich sags euch er erzeugt absolut gar nichts! Aber viell sollte ich es euch auch posten!
    Bevor ihr anfängt mich zu nerven lest meinen ersten Post da ist alles was ihr wissen müsst! Oder erkennt ihr das Problem nicht? Wenn ihr es nicht erkennt hört auf mich zu nerven ich soll euch alles posten und fragt mich!
    Also bevor ihr mir sagt das bei mir die hälfte fehlt! Sagt was fehlt dann poste ich des! Ich hab ein Problem und weis nicht genau was ihr alles braucht!
    Ich dacht alles nötige hätte ich gepostet! Aber wenn ihr sagt die Hälfte fehlt dann poste ich einfach alles weil ich weis eh nicht was ihr braucht!
    Machts doch einfach so wie hustbaer der hat mein Problem erkannt und wollte mir sofort helfen danke hustbaer, aber es hat leider nicht funktioniert der Compiler meldet noch immer das es die nötige Methoder dafür nicht gibt!
    Wenn ihr mich wieder sagen wollt das es euch alles nicht hilft dann schreibt bitte lieber gar nichts, ich habe keine lust mich mit euch herum zu plagen, schließlich zwinge ich euch nicht mir zu helfen! 💡 💡 💡 💡



  • Danke unskilled und danke hustbaer das ihr versucht habt mir zu helfen.

    ///////////////////////////////////////////////////////

    Danke Sebastian Pizer und danke Dravere für gar nichts.


  • Administrator

    GuardianOfLife schrieb:

    Also bevor ihr mir sagt das bei mir die hälfte fehlt! Sagt was fehlt dann poste ich des! Ich hab ein Problem und weis nicht genau was ihr alles braucht!

    1. Es ist ziemlich logisch was wir brauchen. Wir haben nicht dein Wissen über den Code, daher solltest du einen Schritt zurücktreten und die Sache analysieren. Am besten präsentierst du ein kurzes kompilierbares Beispiel, wo man den Code klar ersichtlich sieht. Du präsentierst allerdings Dinge ohne Zusammmenhang, gibst nicht bekannt was genau was ist und hast noch eine Inkonsistenz im präsentierten Code, usw. usf.
    2. Ich habe gesagt was unklar ist, du antwortest darauf, dass dies ersichtlich und logisch ist und wirst zudem noch wütend und unhöflich ... toll, super Antwort, ich bin begeistert ...

    GuardianOfLife schrieb:

    Bevor ihr anfängt mich zu nerven lest meinen ersten Post da ist alles was ihr wissen müsst! Oder erkennt ihr das Problem nicht? Wenn ihr es nicht erkennt hört auf mich zu nerven ich soll euch alles posten und fragt mich!

    In dem Fall, wenn du keine Hilfe brauchst und wir dich nur nerven. Dabei möchte ich nur das Problem verstehen und dir helfen, aber du beleidigst uns lieber ... eine Arroganz ... unglaublich

    Grüssli



  • Ich sag nur wie es ist, egal ich hab keine Lust mehr auf eure Hilfe. Außerdem hab ich das Problem gerade gelöst. Es lag daran das ich _bufferSurf ein Object vom der Klasse OffScreenSurface7 zuteilen wollte, aber es mit dem Konstructor erzeugt hatte, der wiederum keinen Objekt zurückgibt. Ich musste also das Problem wie folgt lösen.

    //View.cpp
    ...
        Direct::OffScreenSurface7 offSurf(_draw,width,height);//zuerst ein Objekt erzeugen
        _bufferSurf=offSurf;//Und dann das Object _bufferSurf zuordnen,
        //wodurch die Methode in IFace (operator=) aufgerufen wurde.
    ...
    


  • Bevor du hier die Leute beleidigst und eh schon weißt was wichtig ist, gehe in dich, schau dir deinen Code an und schlag dann in dich gekehrt ein Yoga - äh sry C++-Grundlagenbuch auf. Schau dir da die Beispiele zu Kopierkonstruktor und Zuweisungsoperator an. GENAU! Dann lies dir die ersten Kommentare durch, GENAU, BITTE! Die Stichworte sind gefallen, noch vor dem Niveau 😕

    Und überleg dir noch, ob du den operator-> fürs zurückgeben eines Members vergewaltigen willst, ebenso ob diese komische Klassenverschchtelung Sinn macht (wenn man nicht mal solch leichte Fehler finden kann...)



  • GuardianOfLife schrieb:

    Danke Sebastian Pizer und danke Dravere für gar nichts.

    GuardianOfLife, du bist es, der Hilfe sucht. Um diese zu erhalten, musst du auch selbst etwas beitragen. Wenn dieser Teil fehlt und entsprechende Kritik an deiner Vorgehensweise ausgeübt wird, brauchst du das nicht gleich persönlich zu nehmen. Aber es gibt hier eben gewisse Regeln, an die auch du dich halten musst. Sei dir versichert, dass du auch in Zukunft darauf aufmerksam gemacht wirst, solltest du das nicht begreifen.

    Es ist im Übrigen nicht das erste Mal, dass du andere Leute bei der Hilfeleistung regelrecht behinderst. Es könnte also durchaus an dir liegen. Siehe
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-244909.html
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-244882.html



  • Was ist denn so schwer zu verstehen?! Schreib' ein kurzes und vollständiges Programm, was Dein Problem verdeutlicht. Code-Fetzen mit vielen Lücken zwischendurch sind genauso eine Zumutung, wie Code der mehrere Seiten füllt. Du kannst nicht erwarten, dass man sich das durchliest. Isoliere das Problem und komm zurück, aber heule hier nicht rum. Hier ist Dir keiner etwas schuldig. Es ist mir klar, dass Du das nicht hören willst, aber so sieht's nunmal aus.

    Gruß,
    SP


Anmelden zum Antworten