将unique_ptr向量分配给向量c ++

时间:2014-05-02 00:52:36

标签: c++ unique-ptr

我目前正试图在我的游戏中加入动态足迹音频。现在是一些代码:

class MyClass
{
    vector< unique_ptr <Sound> > footstep_a;
    vector< unique_ptr <Sound> > footstep_b;
    vector< unique_ptr <Sound> > footstep_c;
    vector< Sound > currentfootsteps;
}

所以基本上我想做的是将一个footstep_向量分配给currentfootsteps,以便我可以拥有:

if( walkingarea == a )
    currentfootsteps = a;
else ......

我尝试过以下操作,但它只会引起一百万个关于矢量的错误:

if ( walkingarea == a )
    currentfootsteps.clear();
    for(int i = 0; i < footstep_a.size(); i++)
        currentfootsteps.push_back( footstep_a[i] );

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

我真的不明白你要做的是什么,但假设Sound类是可复制的,这将编译:

currentfootsteps.clear();
for(auto const& up : footstep_a) {
    currentfootsteps.push_back(*up);
}

请注意,您要在footstep_a中复制每个元素并将其添加到currentfootsteps

如果Sound仅限移动,或者您想避免复制,请改用:

currentfootsteps.clear();
for(auto&& up : footstep_a) {
    currentfootsteps.push_back(std::move(*up));
}

但似乎你应该能够通过使currentfootsteps成为一个指针来避免这一切,并根据满足的条件简单地指向vector之一。

vector< unique_ptr <Sound> > *currentfootsteps = nullptr;

if ( walkingarea == a ) {
  currentfootsteps = &footstep_a;
} else if ...

答案 1 :(得分:1)

顾名思义,应该移动unique_ptr而不是复制到:

currentfootsteps.push_back( footstep_a[i] );

您可以尝试使用.get()获取原始指针,然后将其置于当前足迹中。 与此同时,您需要确保Sound对象的生命周期足够长。

根据我的理解,currentfootsteps仅保留对Sound个对象的引用,而footstep_afootstep_bfootstep_c实际拥有它们。