假设对象的析构函数为:
anObject::~anObject()
{
_functionCalledfromDestructor=1; //this sets the flag = 1
functionCall(); //this function does something different than usual
//on seeing the flag
}
我的问题:
这种在析构函数中编码的样式/方法是一种很好的做法吗?
答案 0 :(得分:10)
答案 1 :(得分:7)
这种在析构函数中编码的样式/方法是一种很好的做法吗?
如果函数根据调用的位置执行两个不同的操作,那么您有两个函数,而不是一个。使这两个函数实际上是两个函数,你不需要问这个问题。
答案 2 :(得分:4)
一般来说,没有。我认为你最好做这样的事情:
class anObject
{
private:
void doSomethingInternal(bool fromDestructor) {...}
public:
void doSomething() {doSomethingInternal(false);};
virtual ~anObject() { doSomethingInternal(true); };
}
答案 3 :(得分:0)
在析构函数中调用函数通常不被认为是好的 练习,因为有可能抛出异常。这个 导致无法正确清理内存和异常行为 在析构函数中是未定义的。
以下是有关在析构函数中抛出异常的更多信息:
SP on throwing in the destructor
在您的情况下,通过公共接口进行明确定义的清理
是一个更好的方式去。例如,您可以提供Dispose
进行清理的方法。
考虑以下内容(伪代码):
public:
void Dispose()
{
bool isDestructing = true;
functionCall(isDestructing);
}