我在编写这个相当简单的程序时遇到了麻烦。我有两个类A和B。B有一个对象A。我需要编写B的Copy构造函数,以便B的两个实例将具有A的不同实例。是否有任何巧妙的方法来做到这一点?要做的一件事是获取parm的所有成员变量,创建一个新的A对象并分配这些成员变量。但是,如果类具有更多的成员变量,那就是一个问题。如何用一种简单的方式写这个?
class A
{
public:
int data;
A()
{
}
A(int parm) : data(parm)
{
}
A(const A&parm)
{
this->data = parm.data;
}
A& operator = (const A& parm)
{
if (this != &parm)
{
this->data = parm.data;
}
return *this;
}
~A()
{
cout << "A is destroyed";
}
};
class B
{
public:
A *a;
B()
{
a = new A(10);
}
B(const B&parm)
{
// How to copy the value of parm so this and parm have different A object
// this.a = parm.a --> both this and parm points to same A object
}
B& operator = (const B&parm)
{
if (this != &parm)
{
this->a = parm.a;
}
return *this;
}
~B()
{
// Null check
delete a;
}
};
B
的副本构造函数需要分配一个新A
对象,data
该对象将从源parm.a
成员中复制,您可以使用A
的副本构造函数来做到这一点:
B(const B &parm) {
a = new A(*(parm.a));
}
另外,在B
的赋值运算符中,两个A
对象均已分配,因此只需调用A
的赋值运算符:
B& operator=(const B &parm) {
if (this != &parm) {
*a = *(parm.a);
}
return *this;
}
话虽如此,如果您摆脱了指针,让编译器为您处理内存分配和复制,则可以大大简化代码:
class A {
public:
int data;
A(int parm = 0) : data(parm) { }
~A() { cout << "A is destroyed"; }
};
class B {
public:
A a;
B() : a(10) { }
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句