Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Verwaltung von Objekten

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
12.07.2004, 20:03 Uhr
~Alex
Gast


Guten Abend zusammen!

ICh habe folgendes Problem:

Ich habe ein parent-class namens Grafik. Diese ist abstrakt und dient nur dazu eine
heterogene Liste von Objekten verschiedener child-classen realisieren zu koennen:



Code:


class Grafik  
{
public:
    Grafik();
    virtual ~Grafik();
    virtual int typ();
    virtual void ausgeben(HWND &hwnd);


};




nun gibt es eien Klasse namens Seite, welche die Grafikobjekte verwalten soll.
immer wenn im Programm ein neues Grafikobjekt erzeugt wird, soll es mit "new" im Heapspeicher erzeugt werden und der entsprechende Pointer in einem array gespeichert werden. Des weiteren soll die variable Seite::oz immer um eins nach oben gesetzt werden wenn ein objekt hinzukommt.
Ich habe versucht das ganze wie folgt zu implementieren:






C++:
Datei Seite.h:
////////////////////////////////////////////////////////////////////////////////////
class Seite  
{
public:
    Seite(HWND hWnd);
    virtual ~Seite();

    void neu(int &x1,int &x2,int &y1,int &y2);
    
    void ausgeben();

private:
    HWND hwnd;
    Grafik* pOb[9999]; // dieses array soll die Grafikobjekte verwalten
    int oz;

};

Datei Seite.cpp:
//////////////////////////////////////////////////////////////////////////////////////
Seite::Seite(HWND hWnd)
      :hwnd(hWnd)
{
    oz=0;

    
}

Seite::~Seite()
{

}

void Seite ::neu(int &x1,int &x2,int &y1,int &y2)
{        
        oz ++;
        pOb[oz]=new Linie(x1,x2,y1,y2);  // hier wird ein objekt namens Linie erzeugt
        

}


void Seite ::ausgeben()
{
    
        for (int i=1; i<=oz; i++)
        {
                
                pOb[i]->ausgeben(hwnd);// hier wird immer nur 1 objekt ausgegeben
                
                
        }
            


}





Das ganze kompiliert au8ch und läuft. jedoch scheibnt die verwaltung nicht korrekt zu arbeiten da bei der ausgabe immer nur das jeweils letzte erzeugte objekt ausgegeben wird.

Dieser Post wurde am 14.07.2004 um 21:47 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.07.2004, 20:33 Uhr
typecast
aka loddab
(Operator)


Du musst oz als static deklarieren, dann im Konstruktor von Seite um eins erhöhen und im Destruktor um eins erniedrigen. Dann klappt das.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.07.2004, 20:47 Uhr
~Alex
Gast


Das war schonmal ein sehr guter Tip.
Habe das jetzt abgeändert. Leider habe ich jetzt ein anderes Problem:

bei, der Ausgabe der Objekte stürzt mein Programm ab. Es scheint so als ob ich ein Objekt ansprechen wuerde das noch nicht erstellt ist.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
12.07.2004, 22:06 Uhr
typecast
aka loddab
(Operator)


Ein bischen Code und eine Fehlermeldung wär nicht schlecht.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
12.07.2004, 22:33 Uhr
~Alex
Gast


Klar keine Problem: Fehlermeldung: "unbehandelte ausnahme in malen.exe dann kommt ne hexzahl und dann Acces violation.
der debugger bleibt bei:


C++:
void Seite ::ausgeben()
{
        for (int i=1; i<=oz; i++)
        {
            pOb[ i ]->ausgeben(hwnd); //hier
        }        

}  



Die callback-schleife sieht folgendermaßen aus:


C++:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    
    int wmId, wmEvent;
    Seite Blatt(hWnd);



    

    switch( message )
    {
        case WM_COMMAND:
            wmId    = LOWORD(wParam);
            wmEvent = HIWORD(wParam);
        
            switch( wmId )
            {
                case IDM_ABOUT:
                   DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
                   break;
                case IDM_EXIT:
                   DestroyWindow( hWnd );
                   break;
                case IDM_LINIE:
                {
                    linie = true;
                    InvalidateRect(hWnd,0,0);
                }break;

                default:
                   return DefWindowProc( hWnd, message, wParam, lParam );
            }
            break;
        case WM_PAINT:
            {
                
        
                if (linie && lbdown)
                {        
                    if (lbup)
                    {    
                        Blatt.neu(x1,x2,y1,y2);    
                    }
                }

                Blatt.ausgeben();

            }break;
        
        case WM_LBUTTONDOWN:
            
            lbdown=true;
            lbup=false;
            x1=LOWORD(lParam);
            y1=HIWORD(lParam);
            InvalidateRect(hWnd,0,0);

            break;


        case WM_LBUTTONUP:

            lbup =true;
            
            
            x2=LOWORD(lParam);
            y2=HIWORD(lParam);
            InvalidateRect(hWnd,0,0);
            
            break;

        case WM_MOUSEMOVE:

            break;


        case WM_DESTROY:
            PostQuitMessage( 0 );
            break;
        default:
            return DefWindowProc( hWnd, message, wParam, lParam );
   }
   return 0;
}




Bearbeitung von typecast:
Kursivschrift abgestellt

Dieser Post wurde am 12.07.2004 um 22:43 Uhr von typecast editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
12.07.2004, 22:50 Uhr
typecast
aka loddab
(Operator)


Dein Problem ist klar. Die Klasse enthält Graphics*

Du legst nur ein einziges Object an und zwar Graphics[oz]. Die anderen Objekte in dem Array sind NICHT mit new allokiert.
Deshalb gibt Graphics[ i ] auch eine Access Violation

Du hast mehrere möglichkeiten:

1.) Graphics ebenfalls static machen

2.) Graphics global definieren

3.) Dir überlegen, ob wirklich alle Instanzen von Seite auf alle Graphics zugreifen sollen.
Kannst du das nicht sinnvoller gestallten, z.B. das nur eine Instanz von Seite existiert, die die ganze arbeit macht.
Oder deine Graphiken so sinnvoll zusammenfassen dass eine Instanz auf eine Gruppe von Grapiken zugreift und der Rest dann von den anderen Graphiken keine Ahnung hat

Wenn du die Wahl hast, dann versuche Mehtode 3 zu implementieren. Alles andere wird dir früher oder später Probleme bereiten.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
12.07.2004, 22:52 Uhr
~Alex
Gast


Danke, ich werds versuchen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
12.07.2004, 22:58 Uhr
~Alex
Gast


Das ganze war auch anders gedacht.
Ich möchte ein Objekt vom Typ Seite haben die die Grafiken verwaltet.
Frage:wenn ich in der schleife schreibe:


C++:

    if (linie && lbdown)
                {        
                    if (lbup)
                    {    
                        Blatt.neu(x1,x2,y1,y2);    //hier (Blatt ist vom Typ seite)
                    }
                }

                Blatt.ausgeben();



sollte doch eigentlich ein neues Grafikobjekt von Blatt angelegt werden:

C++:


void Seite :: neu(int &x1,int &x2,int &y1,int &y2)
{        
    
        pOb[oz]=new Linie(x1,x2,y1,y2);
        
        

}



Oder liege ich da falsc?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
12.07.2004, 23:08 Uhr
typecast
aka loddab
(Operator)


Ja. Eigentlich schon. Was auch immer du damit machen willst.

Pass aber auf eins auf:


C++:
if (!p0b[oz])
   p0b[oz] = new Linie(x1, x2, y1, y2);



Wenn pb0[oz] schon mal mit new allokiert hast, dann solltest du an diese Stelle nicht unbedingt noch ein neues Objekt mit new erschaffen...
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
14.07.2004, 21:40 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


ich würde einfach mal sagen das du einfach zu weit hochzählst:


C++:
for (int i=1; i<=oz; i++)
{
   pOb[ i ]->ausgeben(hwnd); //hier
}        



ein Array fängt bei 0 an, nicht bei 1!


C++:
for (int i=0; i < oz; i++)
{
   pOb[ i ]->ausgeben(hwnd); //hier
}        



evtl hilft das
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: