我改变了一些代码来处理由它调用的某些函数的签名变化。原始代码看起来像(这只是说明性的):
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;
}
答案 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;
}