Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

11

04.10.2006, 19:39

Wenn ich mich nicht vollkommen verguckt hab, dann fehlt im Folgenden ein

C-/C++-Quelltext

1
delete (*m_i);
in der for-Schleife.

Zitat

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
unsigned long WinGui::destroy()
{
    // Jedes Element durchgehen

    for (m_i=m_Windows.begin(); m_i != m_Windows.end(); ++m_i)
    {
        // Element zerstören

        (*m_i)->destroy ();
    }

    // Die Liste leeren

    m_Windows.clear ();

    return OK;
}

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

12

04.10.2006, 23:14

zur SAFE_DELETE Diskussion: Das Problem ist doch nicht einen Nullzeiger freizugeben, sondern dass der Zeiger durch delete nicht zum Nullpointer wird und ein nochmaliges Freigeben eine Zugriffsverletzung auslöst, also ich denke das SAFE_DELETE ist nicht so dumm..
Sollte ich mich irren bitte freundlich darauf hinweisen^^

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

13

05.10.2006, 16:16

Zitat von »"Spik)evil("«

zur SAFE_DELETE Diskussion: [...]

Sehe ich genauso...
Kommen Sie nie mit einem Schwert zu einer Schießerei.

14

05.10.2006, 17:36

@ grek40

Danke, werds verbessern.
Ich gebe bei der Arbeit immer 100%

6% Montags
30% Dienstags
35% Mittwochs
25% Donnerstag
4% Freitag

15

12.10.2006, 15:16

Der Download funktioniert wieder.
Ich gebe bei der Arbeit immer 100%

6% Montags
30% Dienstags
35% Mittwochs
25% Donnerstag
4% Freitag

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

16

28.01.2007, 10:22

Will auch noch mein Senf dazu abgeben! ;)

SAFE_DELETE ist, wie die Funktion hier aufgeführt wurde nich sinnvoll. Ersten ist, wie bereits gesagt, das löschen eines Nullzeigers ohne Konsequenz und zweitens bringt die Zeile: pPointer = NULL; garnichts, da der Zeiger nach Außen hin nicht auf Null gesetzt wird.

Eine Variante die laufen würde wäre folgende:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
template <typename T> inline void SAFE_DELETE (T *&pPointer)
{
    //if (pPointer) 

    {
        delete pPointer;
        pPointer = NULL;
    }
}


Die Funktion FAIL find ich irgendwie witzlos. Erstmal braucht man nicht die ganzen if-Anweisungen, man kann das mit einer Zeile regeln.

C-/C++-Quelltext

1
2
3
4
inline unsigned long FAIL (unsigned long Value)
{
    return ( Value > 0 );
}


Außerdem frage ich mich warum du für den Rückgabewert nicht bool verwendest. Dann reicht folgendes:

C-/C++-Quelltext

1
2
3
4
inline bool FAIL (unsigned long Value)
{
    return Value;
}


Errorcodes... naja, sind halt Patrickstyle. Aber so viel Freunde für Element sind wirlich unschön. Je mehr Elemente es gibt desto länger wird die Liste, d.h. viel Wartungsaufwand und viel zu viele Freundschaften, mit denen man sowiso vorsichtig umgehen sollte.

Ansonsten könntest du bei deinen Klassen auf die const-correctness achten. Zum Beispiel die Methoden aus Element:

C-/C++-Quelltext

1
2
3
4
inline unsigned long get_id ()  const                   {return m_ID;}      // Liefert die ID

    inline HWND get_handle      ()  const                   {return m_Element;} // Liefert das Handle des Elements

    inline HWND get_parent      ()  const                {return m_Parent;}  // Liefert das Handle des Parent Fensters zurück

    inline unsigned long get_type ()  const                {return m_Type;}    // Liefert den Typ des Elements


Desweiteren sind Methoden die in der Klassendeklaration implementiert wurden auch direkt inline. D.h. das inline ist in diesem Fall redundant.

Element fungiert desweiteren als Basisklasse für die ganzen Controllklassen, daher sollte Element auf jedenfall einen virtuellen, evtl sogar reinvirtuellen, Destruktor haben!

Dann ist mir aufgefallen das du häufig OK aus Methoden zurückgibst obwohl sonst keine Fehler auftreten. Was hat das für einen Grund? Wenn sowiso nichts schief gehen kann reicht als Rückgabetyp ein einfaches void vollkommen aus.

Die ganzen GUI-Control Klassen sind ansonsten ja ganz nett. Allerdings ist es witzlos GUI Element auf irgendwelche Fenster zu schmeißen ohne deren Notifikationen zu behandeln. D.h. ich vermisse hier ganz dringend eine Funktionalität auf Notifikationen zu reagieren!!! Ansonsten macht das wirklich wenig Sinn! (Der Umweg über die WinProc des Parents find ich nich ausreichend Konfortabel eigentlich, nur so als Verbesserungstip ;)).

Nun zur Klasse Window. Es ist nicht wirklich toll für jedes Element eine add_XYZ Funktion zu erstellen. Erstmal wird da egtl immer das selbe abgehandelt und zweitens ist der Wartungsaufwand auch hier viel zu hoch. Du solltest stattdessen z.B. die add_ Funktionen in die einzelnen Elemente auslagern und den Parent übergeben.

Hm, zum Schluss aber noch was positives. Finde das Tutorial an sich gelungen, nur halt z.T. verbesserungswürdig! Aber trotzallem gute Arbeit! :)

grüße
@D13_Dreinig

17

28.01.2007, 18:19

Erstmal danke für die vielen Verbesserungsvorschläge.

1. Die SAFE_DELETE werd ich ändern.

2. Auch das mit den Rückgabewerten ohne Fehlerquellen ist eigentlich Sinnlos => werd ich auch ändern

3. Error - Codes find ich aber geschickt, weil man so feststellen kann was für ein Fehler auftritt wenn man den Code nicht einsehen kann (in einer dll oder ähnlichem)

4. Das Methoden, die in Klassen implementiert wurden immer inline sind wusste ich nicht.

5. Das mit const hab ich in meiner neuen Version schon

6. Peinlich, dass der Destruktor nicht virtuell ist. Hab ich aber in meiner überarbeiteten Version gemacht.

7. Den Punkt mit den Notifikationen versteh ich nicht. Bitte um Erklärung^^

8. Die add_ Funktionen werd ich aber vorerst beibehalten.

Weiterhin hab ich schon vor längerer Zeit mal alles so umgestellt, dass man keine WinProc mehr braucht (Man übergibt jetzt bei der initialisierung eine Funktion an) und ich habe für mehrere Elemente Ownerdraw-Funktionen eingebaut. Ich denke ich werde dazu auch noch ein Tutorial schreiben, falls das erwünscht ist.
Ich gebe bei der Arbeit immer 100%

6% Montags
30% Dienstags
35% Mittwochs
25% Donnerstag
4% Freitag

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

18

28.01.2007, 21:24

Zitat von »"Anfänger"«


3. Error - Codes find ich aber geschickt, weil man so feststellen kann was für ein Fehler auftritt wenn man den Code nicht einsehen kann (in einer dll oder ähnlichem)


Richtig, ich finde nur den Stil unschön. Aber das is hier Geschmackssache und war eigentlich kein Kritikpunkt. ;)

Zitat von »"Anfänger"«


7. Den Punkt mit den Notifikationen versteh ich nicht. Bitte um Erklärung^^


Wurde im 2. Teil mit Patrik schon angesprochen glaub ich. Hab ich aber erst nach dem Posten hier gesehen! :) Es sollte möglich sein auf Events direkt beim betreffenden Control zu reagieren.

Zitat von »"Anfänger"«


8. Die add_ Funktionen werd ich aber vorerst beibehalten.


Schade, das macht den Code nämlich unübersichtlich und unhandlich. Da gäbe es viel schönere Ansätze mit denen man sich viel Ärger sparen kann.
@D13_Dreinig

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

20

29.01.2007, 13:49

Zitat


Schade, das macht den Code nämlich unübersichtlich und unhandlich. Da gäbe es viel schönere Ansätze mit denen man sich viel Ärger sparen kann.


Gut^^
Ich überleg mir nen anderen Ansatz und schau dann ob er handlicher und übersichtlicher ist.
Ich gebe bei der Arbeit immer 100%

6% Montags
30% Dienstags
35% Mittwochs
25% Donnerstag
4% Freitag

Werbeanzeige