Wenn auf einem Objekt vom Typ A Kopie Konstruktor, es kopiert wird, aber die Membervariable nicht.
Ihr Code ruft nie Copykonstruktor in der Klasse A.
Ihr Code ruft eine Kopie Konstruktor in der Klasse B und es tut genau das, was soll, wird der Wert von attribute
dh Kopien, die ein ist Zeiger auf ein Objekt der Klasse A.
Mit anderen Worten - nach der Ausführung Ihres Codes haben Sie zwei Instanzen der Klasse B und eine Klasse A-Instanz. In den beiden Instanzen der Klasse B zeigt attribute
auf dieselbe Klasse-A-Instanz.
Dies ist (wahrscheinlich) nicht das, was Sie wollen.
Wie bereits erwähnt (z. B. @ lostbard-Antwort), benötigen Sie einen Kopierkonstruktor in Klasse B, um eine Deep-Copy zu erstellen. Eine tiefe Kopie wird benötigt, weil Klasse B ein Zeigerelement hat.
Auch sollten Sie einige Aufräumarbeiten in Klasse B Destruktor und in Haupt tun.
#include <iostream>
using namespace std;
class A
{
public:
A(char t_name)
{
name = t_name;
}
~A()
{
}
char name;
};
class B
{
public:
A* attribute;
B()
{
attribute = new A('1');
}
/** Copy constructor */
B(const B ©)
{
// Make a new instance of class A
attribute = new A(*copy.attribute);
}
/** Assignment operator */
B& operator= (const B& other)
{
// Delete the existing class A instance
delete attribute;
// and create a new as a copy of other.attribute
attribute = new A(*other.attribute);
}
~B()
{
// Delete the class A instance
delete attribute;
}
};
int main()
{
B* b_variable = new B;
B* b_copy = new B(*b_variable);
// Delete the two class B instances
delete b_variable;
delete b_copy;
return 0;
}
Es ist kein Kopierkonstruktor in Klasse A erforderlich. Der standardmäßig generierte Standard funktioniert, da Klasse A keine Zeigerelemente hat.
EDIT
Wie bereits von @Slava out Sie sollten immer einen Zuweisungsoperator implementieren, wenn Sie eine Kopie Konstruktor (Regel drei) machen, so fügte ich es oben auf den Code.
Einige mögen die Regel von drei, um die Regel von fünf zu sein, also schließt sie auch Bewegung ein. Lesen Sie hier mehr: https://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)
Schreiben Sie den Kopierkonstruktor, operator = und reparieren Sie Ihren Destruktor der Klasse B.Siehe Beiträge auf der Regel von 3 und/oder 5. http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three http://stackoverflow.com/questions/4782757/rule-of -three-wird-rule-of-five-with-c11 –
Warum ändert Ihr Code die Bedeutung von 'A' und' B' in Ihrer * Beschreibung *? Es ist "B", dass ein Mitglied auf ein "A" zeigt. –
@Alex Warum würdest du überhaupt einen Hinweis auf etwas in der heutigen Zeit behalten? Warum nicht einfach ein 'A'-Mitglied behalten und dann sind alle deine Probleme gelöst. –