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

1

14.01.2007, 15:18

Eine Remove Funktion? :)

Hallo,

ich wollte mal fragen, ob es sinn macht eine Removefunktion für Klassen zu schreiben?

da es ja irgendwie lästig ist, dauernd delete blabla, blabla = NULL zu schreiben, wollte ich das in ner funktion lösen.

mein ansatz war folgender



C-/C++-Quelltext

1
2
3
4
5
Remove(CClass *pClass)
{
     delete pClass;
     pClass= NULL;  
}  // end Remove


kann so etwas überhaupt funktionieren? da ja die instanz, die die funktion aufruft in der funktion selbst gelöscht wird?

als Bsp.:

C-/C++-Quelltext

1
2
3
CClass *pbla12 = NULL;
pbla12 = new CBlubberblase134;
pbla12 ->Remove(pbla12);


auf eure Antworten und Anregungn freut sich Simon :)

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

2

14.01.2007, 15:23

Re: Eine Remove Funktion? :)

Zitat von »"Draculark"«


C-/C++-Quelltext

1
2
3
4
5
Remove(CClass *pClass)
{
     delete pClass;
     pClass= NULL;  
}  // end Remove




pClass ist eine Kopie des Zeigers (also der Adressvariable) die du beim Funktionsaufruf übergibst. Die Kopie des Zeigers wird dann auf 0 gesetzt, das hat aber keine Auswirkungen auf den Originalzeiger, weil es halt ne Kopie ist, und du nix am Objekt, sondern am Zeiger selbst änderst.

Benutz doch ein Makro, das is einfacher:

C-/C++-Quelltext

1
#define DELETEP(x) delete x; x = NULL;

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

3

14.01.2007, 15:29

Ich mach es übrigens immer so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
class foo
{
private:
    CClass* pClass;
    bool Initialised;
public:
    foo() : pClass(0), Initialised(false) {}
    ~foo() {if (Initialised) Release();} 
    void Release() {delete pClass; foo(); Initialised = false;}
    void Init() {Initialised = true; pClass = new pClass();}
};
    


edit: ich stelle gerade fest, dass deine Frage nicht auf Klassen bezogen war, also so würde es aussehen, wenn es um das delete x; x = 0; eines Memberobjekts einer Klasse ginge.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

14.01.2007, 16:15

Hi!

@rewb0rn:
Richtig was du da sagst, allerdings ist ein Macro keine besonders gute Lösung. Nehmen wir mal folgendes an:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
std::vector< int* > IntList;

for ( int i = 0; i < 10; ++i )
{
    IntList.push_back( new int( i ) );
}

std::vector< int* >::iterator it( IntList.begin() );

for ( ; it != IntList.end(); ++it )
    DELETEP( *it );


Alles schön und gut, oder? Dummerweise werden die Zeiger hier nicht auf NULL gesetzt. Leider treten so Fehler nur zu häufig auf und Aufgrund des wirklich bescheuerten Debugaufwandes sollte man soweit wie Möglich auf Macros verzichten.

Es geht schließlich auch mit Funktionen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template< typename T >
inline void DeletePtr( T*& ptr )
{
    delete ptr;
    ptr = 0;
}

// ...


std::vector< int* > IntList;

for ( int i = 0; i < 10; ++i )
{
    IntList.push_back( new int( i ) );
}

std::vector< int* >::iterator it( IntList.begin() );

for ( ; it != IntList.end(); ++it )
    DeletePtr( *it );


Und schon ist das Problem gegessen, dank Referenz auf einen Zeiger. Natürlich würde es auch ein Doppelzeiger tun, aber die Lösung per Referenz ist doch etwas schöner und näher an C++. ;)

@Draculark:
Im Grunde ist das eine recht heikle Angelegenheit die du da machen willst. Was wenn du ein Objekt löschst und dann (ausversehen) trotzdem nochmal auf die Instanz zugreifen willst? Dann hast du ein richtiges Problem, nämlich im schlimmsten Fall ein Programmabsturz.

Also solltest du dir doch lieber eine Alternative suchen, z.B. über eine Funktion oder du schreibst dir einen Objektmanager.

grüße
@D13_Dreinig

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

14.01.2007, 16:20

Was schöner ist und was nicht ist wohl wieder so eine Geschmackssache, wobei ich persönlich auch die Variante mit der Funktion "schöner" finde.
Aber wenn man bei rewb0rns Ansatz noch geschweifte Klammern drum herum macht, funzt das auch:

C-/C++-Quelltext

1
#define DELETEP(x) { delete x; x = NULL; }

Wie gesagt, die Funktionsvariante finde ich aber auch eleganter.
Kommen Sie nie mit einem Schwert zu einer Schießerei.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

14.01.2007, 16:27

Zitat von »"Steven77"«

Was schöner ist und was nicht ist wohl wieder so eine Geschmackssache, wobei ich persönlich auch die Variante mit der Funktion "schöner" finde.
Aber wenn man bei rewb0rns Ansatz noch geschweifte Klammern drum herum macht, funzt das auch:

C-/C++-Quelltext

1
#define DELETEP(x) { delete x; x = NULL; }

Wie gesagt, die Funktionsvariante finde ich aber auch eleganter.


Da Macros aber, bekannterweise, sehr schnell als, und vorallem schwehr zu identifizierende, Fehlerquelle auftreten, ist es nicht nur Geschmackssache was man verwendet.

Mehr dazu hier.
@D13_Dreinig

7

14.01.2007, 22:04

hm ists möglich nen pointer als original zu übergeben? weil dann würde doch meine funktion auch aufgehen oder? :D oder darf die instanz nicht während ihrer funktion die sie aufruft gelöscht werden?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

14.01.2007, 22:15

Zitat von »"Draculark"«

hm ists möglich nen pointer als original zu übergeben? weil dann würde doch meine funktion auch aufgehen oder? :D oder darf die instanz nicht während ihrer funktion die sie aufruft gelöscht werden?


Hast du dir mal die Mühe gemacht meinen Post zu lesen?
@D13_Dreinig

9

14.01.2007, 22:30

ja schon^^

nur das hier:

C-/C++-Quelltext

1
inline void DeletePtr( T*& ptr ) 


verwirrt bischen. eine templatepointerreferenz? klingt irgendwie abartig...

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

10

14.01.2007, 22:33

Zitat von »"Draculark"«

ja schon^^

nur das hier:

C-/C++-Quelltext

1
inline void DeletePtr( T*& ptr ) 


verwirrt bischen. eine templatepointerreferenz? klingt irgendwie abartig...


Viel weniger abartig als deine Idee!
@D13_Dreinig

Werbeanzeige