可以使用 class 函数内部的析构函数来重置值吗?
Is it ok to use the destructor inside function of a class to reset values?
在我的讲座中,我没有看到有人使用析构函数将值重置为起始参数,而是在函数中手动执行每个变量。在 reseting/deleting 的 class 函数中使用析构函数会导致任何问题
我的意思的小例子:
class Test1{
private:
int *test;
bool valid;
public:
Test1(int value,bool valid=false){
test=new int(value); this->valid=valid;
}
~Test1(){
delete test; test=nullptr; valid=false;
}
void ResetStats(int NewValue){
this->~Test1();
test1=new int(NewValue);
valid=false;
}
}
调用非平凡的析构函数显式结束对象的生命周期 (why?)。
通过将 ResetStats
和析构函数放在单独的私有函数中来共享 ResetStats
和析构函数之间的功能:
// Both destructor and ResetStats call Reset
~Test1(){
Reset(nullptr);
}
void ResetStats(int NewValue) {
Reset(new int(NewValue));
}
// Shared functionality goes here
private Reset(int *ptr) {
delete test;
test=ptr;
valid=false;
}
没有。析构函数将在对象被销毁时调用,而不是在尝试重置其状态时调用。
为了重置值,我更喜欢使用默认构造对象进行交换,copy/move使用默认构造对象进行构造,或者将赋值移动到默认构造对象。
Test1 test;
// Do stuff
test.swap(Test());
当然,必须实现交换方法、复制构造函数或赋值。查找移动语义以正确实现这些。
考虑 类 强制执行 RAII。在我们的示例中,test 在其构造函数中获取文件句柄。如果您出于重置值的目的调用解构函数,那么当您尝试重置对象时,该对象不再具有文件句柄,因为它是在构造函数中获取并在解构函数中释放的。
在我看来,只有在对象被销毁时才应调用析构函数。
在我的讲座中,我没有看到有人使用析构函数将值重置为起始参数,而是在函数中手动执行每个变量。在 reseting/deleting 的 class 函数中使用析构函数会导致任何问题
我的意思的小例子:
class Test1{
private:
int *test;
bool valid;
public:
Test1(int value,bool valid=false){
test=new int(value); this->valid=valid;
}
~Test1(){
delete test; test=nullptr; valid=false;
}
void ResetStats(int NewValue){
this->~Test1();
test1=new int(NewValue);
valid=false;
}
}
调用非平凡的析构函数显式结束对象的生命周期 (why?)。
通过将 ResetStats
和析构函数放在单独的私有函数中来共享 ResetStats
和析构函数之间的功能:
// Both destructor and ResetStats call Reset
~Test1(){
Reset(nullptr);
}
void ResetStats(int NewValue) {
Reset(new int(NewValue));
}
// Shared functionality goes here
private Reset(int *ptr) {
delete test;
test=ptr;
valid=false;
}
没有。析构函数将在对象被销毁时调用,而不是在尝试重置其状态时调用。
为了重置值,我更喜欢使用默认构造对象进行交换,copy/move使用默认构造对象进行构造,或者将赋值移动到默认构造对象。
Test1 test;
// Do stuff
test.swap(Test());
当然,必须实现交换方法、复制构造函数或赋值。查找移动语义以正确实现这些。
考虑 类 强制执行 RAII。在我们的示例中,test 在其构造函数中获取文件句柄。如果您出于重置值的目的调用解构函数,那么当您尝试重置对象时,该对象不再具有文件句柄,因为它是在构造函数中获取并在解构函数中释放的。
在我看来,只有在对象被销毁时才应调用析构函数。