Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
30.11.2001, 07:56
Nicemice
Moderator


Hi
Mein Problem des Tages:

Ich habe 2 Pointer:
NM_List<int> *IntList1 = new NM_List<int>;
NM_List<int> *IntList2;

Jetzt möchte ich das Objekt, was an IntList1 hängt an IntList2 kopieren, so daß ich nachher beide getrennt bearbeiten kann. How to ?

--

www.d3opencoop.com - A Doom3 Cooperative Mod

zum Seitenanfang zum Seitenende Profil || Suche
001
30.11.2001, 10:49
Hessie J.



Definiere einen entsprechenden Copy-Constructor in der NM_List Klasse
Quellcode:NM_List::NM_List(const NM_List<T> &right)
{
  // Hier jetzt alle Objekte aus right kopieren (z.B. Listeneinträge)
}

Benutzt wird das dann so:
Quellcode:IntList2 = new NM_List<int>(*IntList1);

--

zum Seitenanfang zum Seitenende Profil || Suche
002
30.11.2001, 13:40
Kriz



Hmmmmmmmm...

Der Aufrufer übergibt einen Zeiger auf NM_List<T>, während der Aufgerufene eigentlich eine konstante Referenz auf NM_List<T> erwartet?!?!?! Das geht aber nicht so, mein lieber Hessie James =)

Richtig ist:Quellcode:IntList2 = new NM_List<int>(IntList1);Zu beachten wäre nur noch, daß im Falle einen solchen Kopierkonstruktors alle Methoden aus dem Template NM_List<T>, die für die Initialisierung einer tiefen Kopie zuständig sind, ausnahmslos als const deklariert sein müssen, sonst meckert der Compiler:Quellcode:...
void DoSomething(void) [b][i]const[/i][/b];
...
};

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
003
30.11.2001, 14:25
Hessie J.



Natürlich kann man keinen Zeiger übergeben, wenn eine konstante Referenz erwartet wird. Genau deshalb dereferenziere ich den Pointer aus Nicemice's Beispiel ja auch. :)

--


Dieser Beitrag wurde am 30.11.2001 um 14:29 von Hessie J. bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
004
30.11.2001, 17:15
Kriz



OMG, den habe ich glatt übersehen, sorry =). Ja, dann stimmt es. Bleibt nur noch die Frage, ob der Kopierkonstruktor nicht dann gleich konstante Zeiger nehmen sollte anstatt eine konstante Referenz, wenn Nicemice eh nur mit Zeigern arbeiten möchte...

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
005
30.11.2001, 18:24
Nicemice
Moderator


mmh, gecodet hab ich es jetzt, aber ohne die Zeiger zu dereferenzieren.
(so wie Kriz es geschrieben hat)
Ich mußte auch nichts als konstant definieren.
Was ist genau der Unterschied zu Hessie J.'s Lösung ?

--

www.d3opencoop.com - A Doom3 Cooperative Mod

zum Seitenanfang zum Seitenende Profil || Suche
006
30.11.2001, 21:02
Kriz



Es gibt keinen Unterschied, da meine Version durch die fehlende Dereferenzierung eh falsch war.

Aber wenn du nichts const machen mußt, dann ist irgendwas faul...

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
007
30.11.2001, 21:38
Nicemice
Moderator


mmh, die Liste funktioniert eigentlich ganz gut...

--

www.d3opencoop.com - A Doom3 Cooperative Mod

zum Seitenanfang zum Seitenende Profil || Suche
008
30.11.2001, 23:41
Kriz



Na ja, ich glaube ich habe mich etwas undeutlich ausgedrückt =)

Wenn man einer Methode das Attribut const verleiht:Quellcode:void FooBar(void) const;, dann wird diese Methode eben konstant (logisch). Konstante Methoden können daher dann auch nur noch von normalen oder konstanten Instanzen aufgerufen werden. Ein konstantes Objekt kann dann aber keine nicht-konstanten Methoden mehr aufrufen, da dies ja u.U. bedeuten würde, daß die Konstantheit der Instanz und seinen Elementen untergraben wird.

Daher ist bei einem Kopierkonstruktor wie NM_list(const NM_List<T> &ref) nur die Möglichkeit gegeben, daß man über die Referenz ref nur auf konstante Methoden zugreifen kann, aber nicht mehr auf normale. Das meine ich damit, daß man möglichst alle relevanten Methoden aus NM_List<T> als konstant deklariert. Das sind in den meisten Fällen protected Get-Methoden oder Get-Methoden allgemein.

Ich hoffe, das war jetzt etwas durchsichtiger als mein vorheriger Post.

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche