将本地方法变量分配给类指针

时间:2017-03-24 20:29:29

标签: c++ copy-constructor

我改变了一些代码来处理由它调用的某些函数的签名变化。原始代码看起来像(这只是说明性的):

int main()
{
   TestClassA instance;
   instance.MethodA();
   instance.MethodB();
   // do other stuff with instance
}

class TestClassA
{
   void MethodA ()
   {
       UList* aList = NULL;
       getListOfStuff(aList);
       // do some stuff
       fList = aList;
   }
   void MethodB ()
   {
       //do something with fList
   }
   UList* fList;
}

struct Ulist
{
   int value;
   std::vector<Ulist> components;
}

getListOfStuff(UList* aList)
{
   aList = new UList();
   PopulateOriginal(aList);
}

getListOfStuff的签名现已更改(更改超出了我的控制范围)到:

getListOfStuff(UList& aList)
{
   aList=PopulateNewVersion();
}

似乎我不清楚我在问什么,所以要澄清......我要问的是如何调用方法getListOfStuff的新版本并安全地存储从中返回的数据(原始指针字段aList中的fList参数),稍后可以从MethodB访问该文件。

继续下面的@GuillaumeGris回答,以下工作会如何? (我不确定的是,新getListOfStuff中的分配是否影响fList退出后MethodA是否仍然指向有效数据。)

void MethodA ()
{
   UList* aList = new UList();
   getListOfStuff(*aList);
   // do some stuff
   fList = aList;
}

1 个答案:

答案 0 :(得分:1)

您不需要显式堆分配(new)。

class TestClassA
{
   void MethodA ()
   {
       // Clear components
       fList.components.clear();

       getListOfStuff(fList);
   }
   UList fList;
}

如果fList是可选的,我建议使用std::unique_ptr

class TestClassA
{
   void MethodA ()
   {
       if (!fList)
           fList = std::make_unique<Ulist>();
       else
       {
           // Clear components
           fList->components.clear();
       }

       getListOfStuff(*fList);
   }
   std::unique_ptr<UList> fList;
}