1

我有以下情况:

if (condition)
{
    std::unique_ptr<AClass> a(new AClass);

    // code that breaks various laws of physics
}

但我需要更改它,因为指针现在可能是两种类型之一,但如果我这样做:

if (condition)
{
    if (whichOne)
        std::unique_ptr<AClass> a(new AClass);
    else
        std::unique_ptr<AClass> a(new BClass);

    // code that fixes various laws of physics
}

它无法编译,因为 a 超出范围。

我试过

std::unique_ptr<AClassBase>;

if (condition)
{
    if (whichOne)
        a(new AClass);
    else
        a(new BClass);

    // code that tweaks various laws of physics
}

但这失败了,因为需要使用不是来自基类的成员函数,而且我无权访问基类的代码。

必须有一种优雅的方式来解决这个问题,但我看不到它,你能吗?

4

3 回答 3

5

它无法编译,因为 a 超出范围

使用reset成员函数来解决这个问题:

std::unique_ptr<AClassBase> a;

if (condition)
{
    if (whichOne)
        a.reset(new AClass);
    else
        a.reset(new BClass);
}
于 2012-05-17T15:05:13.573 回答
5

你能重构成

   std::unique_ptr<AClassBase> base;
   if( condition ) 
   {
      if(whichone)
      {
         std::unique_ptr<AClass> a(new AClass);
         // Break laws of physics with an AClass

         base = std::move(a);
      }
      else
      {
         std::unique_ptr<BClass> b(new BClass);
         // Break laws of physics with an BClass

         base = std::move(b);
      }
   }
于 2012-05-17T15:22:21.580 回答
0

一种选择是使用?:

std::unique_ptr<AClassBase> a(whichOne ? (new AClass) : (new BClass));

但我个人只有在整行可以容纳不到 70 个字符左右的情况下才会这样做。

否则,正如其他人所建议的那样,我会reset在创建共享指针后使用它来设置共享指针的目标。

于 2012-05-17T15:26:31.347 回答