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

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

1

30.04.2012, 16:46

Modell kopieren

Ich würde gerne wissen ob es möglich ist, wenn man ein tbModel* abc; ertsellt hat, dass man es in ein anderes tbModel* kopieren kann. Etwa so:

C-/C++-Quelltext

1
2
3
4
tbModel* abc = new tbModel;
abc->Init("abc.tbm");

tbModel* apfelkuchen = abc;

Irgendwas mache ich da falsch, denn ich bekomme eine Zugriffsverletzung. Wie geht es? und ist es überhaupt möglich?
Danke.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

30.04.2012, 16:52

abc ist doch ein Zeiger. Wenn du den Zeiger kopierst dann hast du zwei Variablen die auf das selbe Objekt zeigen. Guck dir die tbModel Klasse mal an und guck mal nach dem Kopierkonstruktor. Kannst die Klasse ja auch dementsprechend anpassen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

30.04.2012, 16:54

Gibt keinen Kopierkonstruktor, den muss er sich selber programmieren. ;)
FSA, deine Frage verrät, dass du noch nicht wirklich verstanden hast, wie Zeiger und Objekte funktionieren.
Das sind aber absolute Grundlagen in C++ ...

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

4

30.04.2012, 17:22

Kopien von Klassen (bzw. deren Instanzen) legt man normalerweise so an:

C-/C++-Quelltext

1
2
Klasse* a = new Klasse();
Klasse* b = new Klasse(&a);


Der Copy-Constructor wird normalerweise vom Compiler erstellt. Das heißt du musst ihn nicht selber schreiben. Die Membervariablen werden dann für die neue Instanz übernommen.

5

30.04.2012, 17:42

Der Copy-Constructor wird normalerweise vom Compiler erstellt. Das heißt du musst ihn nicht selber schreiben. Die Membervariablen werden dann für die neue Instanz übernommen.

Tjo, nur leider weiß der Compiler nicht, ob er eine tiefe oder eine flache Kopie erzeugen soll oder irgendein Mittelding. Er erzeugt also einfach eine flache Kopie was bei komplexeren Datentypen ziemlich falsch sein kann.

Mehr zum Thema: http://de.wikipedia.org/wiki/Flache_Kopie (oder such selbst).
Lieber dumm fragen, als dumm bleiben!

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

6

30.04.2012, 20:23

Mag sein, ich weiß nicht ob das Einstellungssache ist, aber bei mir funktioniert es so.

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

7

30.04.2012, 21:48

Jaa... auf den Kopierkonstruktor hätte ich auch mal kommen können.Ich kann mich verteidigen: Ich habe noch nie etwas mit einem Kopierkonstruktor gemacht, nur drüber gelesen :) Ich bedanke mich und werde es mal testen.
MfG

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

30.04.2012, 22:41

Mag sein, ich weiß nicht ob das Einstellungssache ist, aber bei mir funktioniert es so.

Solange die Member nur ordinäre Datentypen sind oder eine flache Kopie reicht, klar geht das. Aber ich wette mir Dir, dass Du da irgendwann sehr sehr hässliche Bugs haben wirst, wenn Du das auch in Zukunft immer dem Compiler überlasst.

Kleines Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Foo
{
  Bar* member;
  Foo ( ) { member = new Bar(); }

 ~Foo ( ) { delete member; }

  void epicFail ( ) { member->kaboom ( ); }
}

Foo* x = new Foo ( ); 
Foo* y = new Foo ( *x );
delete x;
y->epicFail ( );


Und nein, das ist keine Einstellungssache, weil der Compiler gar nicht wissen *kann*, wie er eine Deep-Copy von "member" erstellen muss. Muss er member->clone() aufrufen? Oder member->getCopy()? Oder Bar::copy(member)? Oder was ganz anderes? Unklar, also kopiert er nur den Zeiger.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige