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
}

如果我没记错的话,这意味着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 );
4

3 回答 3

2

这不是一种危险的做法,但是如果您是 的类作者cA,请覆盖operator=,以便它进行正确的复制。

同样沿着这些思路,实现一个复制构造函数。

于 2013-06-04T01:37:08.523 回答
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;
};

不,你之前所做的并不危险,但也许只是有点难以理解。

于 2013-06-04T02:00:22.937 回答
1

没关系。但这取决于。

如果您的类是普通的旧数据类型(例如,如果它都是简单的、非指针或非资源管理成员),则不需要实现复制构造函数或赋值运算符。例如,如果cA只保存一堆浮点数、整数和布尔值,您需要简单地复制每个成员的值,那么自动编译器生成的复制构造函数就可以了。

但是,如果它拥有指向某个内部资源的指针,那么您需要实现一个复制构造函数和赋值运算符,以正确处理底层资源的复制(“深度”复制)。

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

此外,它可以帮助练习private在创建新类时自动声明复制构造函数和赋值运算符。然后,当您尝试进行复制分配时会出现编译器错误,此时您可以删除声明以允许编译器生成自动版本。这样,您就可以更好地控制和反馈您的课程的使用方式,并且可以避免以后出现一些意外。

于 2013-06-04T01:46:17.747 回答