我正在创建一些模板类,现在想要将它们相互转换。 我写了函数,现在想知道它有多糟糕:
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并在对象重新分区后返回由被破坏的方法创建的返回对象吗?
答案 0 :(得分:2)
有几件事情可以删除这个&#39;一个坏主意,但其中一个是有人迟早会做这样的事情:
Connection<Foo> foo;
Connection<Bar> * bar = foo.ConnectTo<Bar>(); // oops!
...此时ConnectTo()会尝试删除foo,因为foo没有分配新的,未定义的行为,崩溃和一般的不快乐将随之而来。
答案 1 :(得分:0)
这是一个坏主意。你最好学会使用引用计数指针(boost中的shared_ptr或者后来的标准称之为 - 我现在正在消隐)。一旦你这样做,你的编码风格将会改变,生活变得干净,简单和可靠。你从不编码新的或再次删除,小猫呜呜声,羊羔gambol,...
所有的开玩笑 - 这真的是一个非常好的学习习惯
在您的情况下,当旧的连接对象不再被引用时,它将被删除。