删除它然后返回创建的对象

时间:2014-06-21 20:55:01

标签: c++ object return this delete-operator

我正在创建一些模板类,现在想要将它们相互转换。 我写了函数,现在想知道它有多糟糕:

template<class ConnectionType>
class CONNECTION
{
public:
    ConnectionType weight;
    template<class FinalType> CONNECTION<FinalType>* ConvertTo()
    {
        CONNECTION<FinalType>* temp = new CONNECTION<FinalType>( );
        temp->weight = (FinalType)this->weight;
        delete this;
        return temp;
    }
    virtual ~CONNECTION() {}
};

正如你所见,Iam创建新对象,复制数据,删除当前对象并返回新对象。那么现在可以先调用delete this并在对象重新分区后返回由被破坏的方法创建的返回对象吗?

2 个答案:

答案 0 :(得分:2)

有几件事情可以删除这个&#39;一个坏主意,但其中一个是有人迟早会做这样的事情:

Connection<Foo> foo;
Connection<Bar> * bar = foo.ConnectTo<Bar>();  // oops!

...此时ConnectTo()会尝试删除foo,因为foo没有分配新的,未定义的行为,崩溃和一般的不快乐将随之而来。

答案 1 :(得分:0)

这是一个坏主意。你最好学会使用引用计数指针(boost中的shared_ptr或者后来的标准称之为 - 我现在正在消隐)。一旦你这样做,你的编码风格将会改变,生活变得干净,简单和可靠。你从不编码新的或再次删除,小猫呜呜声,羊羔gambol,...

所有的开玩笑 - 这真的是一个非常好的学习习惯

在您的情况下,当旧的连接对象不再被引用时,它将被删除。