Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Softwaretechnik » Copy Constructor C++ » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Copy Constructor C++
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Tommy
Jungspund


Dabei seit: 02.12.2014
Beiträge: 10

Copy Constructor C++ Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Ich habe eine kleine Unklarheit beim Erstellen eines Copy Constructors, der eine tiefe Kopie erzeugen soll:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:

CMatrix::CMatrix(int M, int N)
{
	m_rows=M;
	m_cols=N;
	m_size=m_rows*m_cols;
	m_pArray = new double[m_size];
}

CMatrix::CMatrix(const CMatrix& orig)
{

//	double* m_pArray;                             
//	m_pArray = new double[orig.m_size];   

	m_pArray = orig.m_pArray;
	m_rows = orig.m_rows;
	m_cols = orig.m_cols;
	m_size = orig.m_size;


	for (int i=0; i<m_size; i++)
		{
			m_pArray[i] = orig.m_pArray[i];
		}

		return;

}


Ich war der festen Überzeugung, dass ich erst wie im auskommentierten Teil ein neues dynamische Array erzeugen muss, mit den Variablen von dem Array das ich kopieren möchte.
Allerdings stürzt das Programm dann immer ab.

Ohne den auskommentierten Teil funktioniert das Ganze wunderbar, ich habe in meiner printfunktion mittles "this" und "&m_pArray" die Adressen der beiden Objekte und deren Arrays überprüft und festgestellt, dass sie unterschiedliche Adressen haben.

Daher gehe ich davon aus, dass die Inhalte auch in unterschiedlichen Adressen gespeichert sind, wie in einer tiefen Kopie vorgesehen.

Aber wieso?

Ich habe doch gar kein neues Array erzeugt ?

Oder ist das der Teil, der ein neues dynamisches Array erzeugt?

code:
1:
2:
3:
4:
5:
        m_pArray = orig.m_pArray;
	m_rows = orig.m_rows;
	m_cols = orig.m_cols;
	m_size = orig.m_size;


Und wenn ja, wieso muss ich dann nicht "new" benutzen ?

Liegt das daran, dass die Zeile " m_pArray = orig.m_pArray " auf die Zeile im Default Konstruktor verweist und für den Compiler so aussieht: "m_pArray = new double[m_size]" ?
Also, dass quasi der Teil hinter dem Gleichheitszeichen durch den Teil im Default Konstruktor ersetzt wird ?

Und da die Variable "m_pArray" in meiner Klassendefinition schon intitalisiert wurde, muss ich das nicht ein zweites Mal machen ?

Ich hab das Gefühl ich steh vorm Baum und seh den Wald nicht verwirrt
02.12.2015 16:08 Tommy ist offline E-Mail an Tommy senden Beiträge von Tommy suchen Nehmen Sie Tommy in Ihre Freundesliste auf
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hallo Tommy,

das Problem ist, dass Du in Zeile 13 m_parray neu definierst. Du musst die Klassenvariable weiter verwenden. Weiterhin ist Zeile 16:
code:
1:
2:
3:
m_pArray = orig.m_pArray;


flasch, da Du damit den alten Pointer auf das Array auf die neue Klassenvariable kopierst.

Schau dir mal folgenden Code an:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
CMatrix::CMatrix(int M, int N)
{
	m_rows=M;
	m_cols=N;
	m_size=m_rows*m_cols;
	m_pArray = new double[m_size];
}

CMatrix::CMatrix(const CMatrix& orig)
{

	//	double* m_pArray;                             
	m_pArray = new double[orig.m_size];   

	//m_pArray = orig.m_pArray;
	m_rows = orig.m_rows;
	m_cols = orig.m_cols;
	m_size = orig.m_size;


	for (int i=0; i<m_size; i++)
	{
		m_pArray[i] = orig.m_pArray[i];
	}

}


Gruß,

Karlito
05.12.2015 11:38 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Softwaretechnik » Copy Constructor C++