2013-06-04 102 views
1

以任何方式危险吗?我不知道其他的做法,但似乎很可疑。危险的做法?

class cA 
{ 
public: 
    cA(){} 
    ~cA(){} 
    int a; 
//say class have tons of members.. 
}; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    cA obj; 
    cA *ptr = new cA; 
    *ptr = obj; 
    //ofc there is a 'delete ptr;' after 
} 

如果我记得没错的C++这意味着cA对象将被创建并ptr将指向它,我必须这样做,以插入长寿命容器(vector<cA*>)。

将obj的内容从堆栈复制到堆的方式有效吗?

编辑可能的解决方案?

class cA 
{ 
public: 
    cA(){} 
    ~cA(){} 
    int a; 
    void Copy(cA & ref) 
    { 
     a = ref.a; 
    } 
}; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    cA obj; 
    cA *ptr = new cA; 
    ptr->Copy(obj); 
+1

取决于其他成员。如果班级拥有资源,是的。记录三条规则。 –

+0

关于资源的好处,关于如何安全完成的好主意?我想创建一个'Copy(cA&a)'方法并手动复制所有成员。 –

+1

@ViniyoShouta:只使用标准拷贝构造函数(隐式生成或用户定义)。正如Luchian所指出的那样,你需要了解什么是[三规则](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-ree)(或C + +11)。 – syam

回答

2

而不是这种形式:

cA obj; 
cA *ptr = new cA; 
ptr->Copy(obj); 

为什么这种形式的?

cA obj; 
cA *ptr = new cA(ob); 

您的副本构造函数如下所示。还应该有一个赋值操作符。

class cA 
{ 
public: 
    cA(){} 
    CA(const cA& ref) 
    { 
     a = ref.a; 
    } 
    ~cA(){} 

    cA& operator=(const cA& p) { 
     if (this != &p) { // make sure not same object 
      a = p.a; 
     } 
     return *this; // Return ref for multiple assignment 
    } 

    int a; 
}; 

而且没有什么你做之前是不会有危险,但也许只是一点点更难理解。

+0

没有它不难,它好多了,非常感谢这个答案! –

+0

如果复制语义已经被类数据成员正确实现,那么写复制构造函数和复制赋值运算符是绝对没有意义的。 OP没有发布该类的实际内容,但该示例中发布的内容不需要额外的定义。而且,使用原始的基于赋值的方法没有任何问题。 – AnT

+0

当然,你是对的。我刚刚完成。然后,如果有人看到这一点,并需要做深度复制,他们可以看到他们将执行这些。 – Matt

2

这不是一个危险的做法,但是如果你是该类笔者cA,覆盖operator=,以便它正确的副本。

也沿着这些相同的路线实现复制构造函数。

1

这很好。但这取决于。

如果您的类是普通的旧数据类型(例如,如果它是所有简单的非指针或非资源管理成员),则不需要实现复制构造函数或赋值运算符。举例来说,如果cA只是持有一堆浮点数,整数和布尔值,你需要简单地复制每个成员的值,那么自动编译器生成的拷贝构造函数将会很好。

但是,如果它包含指向某些内部资源的指针,则需要实现正确处理底层资源复制(“深层”副本)的复制构造函数和赋值运算符。

如果您打算继承cA,则只需要虚拟析构函数。否则,你只是无故添加vtable指针膨胀到类的每个实例。如果你不打算继承子类,并且正在使用C++ 11,那么你可以将你的类设置为final,这意味着如果有人试图子类化cA(这会给它们一个编译器),你不必担心虚拟析构问题错误)。

此外,它可以帮助进行创建新类时自动声明复制构造函数和赋值运算符为private的练习。然后,当您尝试执行复制分配时会出现编译器错误,此时您可以删除声明以允许编译器生成自动版本。通过这种方式,您可以对自己班级的使用情况有更多的控制权和反馈意见,并且可以在稍后避免出现一些意外。