1

我有一个被大量引用的变量。它最初是一个自动变量。

现在我决定在一些代码中间我想调用它的 dtor 来重置它的状态,所以我打算释放并重新分配它。执行此操作的标准方法当然是调用 delete 并创建一个新的。

前:

void func() {
    ClassName varname; 
    while (varname.check()/*...*/) { if (varname.function()/*...*/) { /* bunches of code ... */
            /*... some more code ... */ 
        }
    } 
}

现在我想要:

void func() {
    ClassName varname; 
    while (varname.check()/*...*/) { if (varname.function()/*...*/) { /* bunches of code ... */
            if (key_code[SDLK_r]) { // Pressing R key should reset "varname"!
                /* Here I want to dealloc and realloc varname! */
                /* But if I declare varname as a ptr on line 2, */
                /* line 3 (rest of code) must be refactored. */
            }
        }
    } 
}

我的第一次尝试是将第 2 行更改为这样的

ClassName *varnamep = new ClassName();
ClassName& varname = *varnamep;

但我不确定这是否意味着我以后可以调用 delete 并重新分配参考!

                delete &varname; 
                varnamep = new ClassName();
                varname = *varnamep; // I assume compiler will error here because I can't reassign a ref. 

我可以通过其他方式做到这一点吗?还是我应该把它吸起来,然后找一个替换varname.成的varname->?在这种特殊情况下,对于我的实际情况,我可能会实现一个成员函数reset(),而不用担心这个实际问题。但是我想知道是否有一些捷径可以有效地将引用视为指针(或者可能会证明这是荒谬的废话)

4

2 回答 2

4

鉴于ClassName varname,你可以这样做:

varname.~ClassName();
new (&varname) ClassName;

但我不会推荐它。这使用了 C++ 的两个鲜为人知的特性:显式析构函数调用和放置 new。仅当它在性能上产生显着差异时才使用它,由探查器测量,并且ClassName构造函数不能抛出异常。

如果ClassName::operator=做你需要的(或者你可以修改它来做你需要的),你可以这样做:

varname = ClassName();

这比使用显式析构函数调用后跟placement-new 更容易理解。

另一个常见的成语:

varname.swap(ClassName());

如果ClassName有一种有效的swap方法,就像标准容器一样,这很有效。这很微妙,如果您决定使用它,它可能值得评论。

于 2012-07-03T05:42:26.230 回答
2

标准方法是删除并创建新实例。只需重新分配变量:

ClassName varname = .... ;

....

if (some condition) {
  varname = SomethingElse;
}

并确保复制构造函数、赋值运算符和析构函数正确处理由ClassName.

于 2012-07-03T05:38:36.730 回答