如何将元素插入独特指针的多维矢量中

How to insert elements into a multidimensional vector of unique pointers?

本文关键字:指针 元素 插入      更新时间:2023-10-16

我有一个带有_Rounds私有成员的转弯类。_ Rounds是STD独特指针的二维性STD向量,称为Animation:

turn.h

std::vector<std::vector<std::unique_ptr<Animation>>> _rounds;   

animation.h

class Animation
{
public:
    enum Type
    {
        MOVE,
        ATTACK,
        DIE,
        FADEOUT,
        MAX_TYPES
    };
//Constructors
Animation();        
Animation(Creature* creature, Animation::Type type, GameManager* gameManager, const std::function<void()> callback = nullptr);
//Getters   
const int& getOriginRowClipsIndex() { return _originRowClipsIndex; }
bool& getFinished() { return _finished; }
Type& getType() { return _type; }
Creature& getCreature() { return *_creature; }
//Setters       
void setOriginRowClipsIndex(int originRowClipsIndex) { _originRowClipsIndex = originRowClipsIndex; }
void animate(); 
void reset();
SDL_Rect* getClip(int index) {      
    return &_clips[index];      
}
private:
    GameManager* _gameManager;
    Creature * _creature;
    bool _finished;
    unsigned int _clipIndex;
    int _frequency;
    int _originRowClipsIndex; //Origin index of anim clips.     
    std::vector<SDL_Rect> _clips;   
    Type _type; 
    std::function<void()> _callback;
};
#endif

我从我的代码的各个点动态分配动画,并尝试将它们添加到_Rounds,以此为turn公共方法,称为AddAnimation:

auto animation = std::make_unique<Animation>(this, Animation::Type::MOVE, _gameManager);            
turn.addAnimation(std::move(animation)); //Use move to make addAnimation take ownership of the animation.

然后转向ADDANIMATION((方法尝试将动画添加到其成员_ROUNDS中,如下所示:

turn.cpp

void Turn::addAnimation(std::unique_ptr<Animation> animation)
{   
unsigned int roundIndex;
//Set animating to true when the first animation is added to the first animation round. TODO: Move this elsewhere.
if (_rounds.size() == 0)
    _animating = true;
if (animation->getType() == Animation::MOVE) { //All move animations go on first round.
    roundIndex = 0;
    if (animation->getCreature().isPlayer()) //Set _playerMoves to be able to set monster attacks on the correct round index.
    {
        _playerMoves = true;
    }
}else if (animation->getType() == Animation::ATTACK) 
{
    roundIndex = _playerMoves ? _nAttacks + 1 : _nAttacks;
    _nAttacks++; //Increment number of attacks.     
}
else
{
    roundIndex = _rounds.size();
}
//Check if the wanted round index already exists and create if not.
if (roundIndex >= _rounds.size()) {
    //_rounds.push_back({});
    _rounds.resize(_rounds.size() + 1);
}
//Add animation to animations vector.
_rounds[roundIndex].push_back(std::move(animation));
}

但是,我遇到了一个错误,说我正在尝试引用已删除的函数,就好像我试图使用已删除的复制构造函数或其他内容一样。

> 1>------ Build started: Project: Roguelike, Configuration: Debug Win32 ------
1>  Turn.cpp
1>c:program files (x86)microsoft visual studio 14.0vcincludexmemory0(637): error C2280: 'std::unique_ptr<Animation,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': attempting to reference a deleted function
1>          with
1>          [
1>              _Ty=Animation
1>          ]
1>  c:program files (x86)microsoft visual studio 14.0vcincludememory(1435): note: see declaration of 'std::unique_ptr<Animation,std::default_delete<_Ty>>::unique_ptr'
1>          with
1>          [
1>              _Ty=Animation
1>          ]
1>  c:program files (x86)microsoft visual studio 14.0vcincludexmemory0(755): note: see reference to function template instantiation 'void std::allocator<_Ty>::construct<_Objty,std::unique_ptr<Animation,std::default_delete<Animation>>&>(_Objty *,std::unique_ptr<Animation,std::default_delete<Animation>> &)' being compiled
1>          with
1>          [
1>              _Ty=std::unique_ptr<Animation,std::default_delete<Animation>>,
1>              _Objty=std::unique_ptr<Animation,std::default_delete<Animation>>
1>          ]
1>  c:program files (x86)microsoft visual studio 14.0vcincludexmemory0(755): note: see reference to function template instantiation 'void std::allocator<_Ty>::construct<_Objty,std::unique_ptr<Animation,std::default_delete<Animation>>&>(_Objty *,std::unique_ptr<Animation,std::default_delete<Animation>> &)' being compiled
1>          with
1>          [
1>              _Ty=std::unique_ptr<Animation,std::default_delete<Animation>>,
1>              _Objty=std::unique_ptr<Animation,std::default_delete<Animation>>
1>          ]
1>  c:program files (x86)microsoft visual studio 14.0vcincludexmemory0(894): note: see reference to function template instantiation 'void std::allocator_traits<_Alloc>::construct<_Ty,std::unique_ptr<Animation,std::default_delete<Animation>>&>(std::allocator<_Ty> &,_Objty *,std::unique_ptr<Animation,std::default_delete<Animation>> &)' being compiled
1>          with
1>          [
1>              _Alloc=std::allocator<std::unique_ptr<Animation,std::default_delete<Animation>>>,
1>              _Ty=std::unique_ptr<Animation,std::default_delete<Animation>>,
1>              _Objty=std::unique_ptr<Animation,std::default_delete<Animation>>
1>          ]
1>  c:program files (x86)microsoft visual studio 14.0vcincludexmemory0(893): note: see reference to function template instantiation 'void std::allocator_traits<_Alloc>::construct<_Ty,std::unique_ptr<Animation,std::default_delete<Animation>>&>(std::allocator<_Ty> &,_Objty *,std::unique_ptr<Animation,std::default_delete<Animation>> &)' being compiled
1>          with
1>          [
1>              _Alloc=std::allocator<std::unique_ptr<Animation,std::default_delete<Animation>>>,
1>              _Ty=std::unique_ptr<Animation,std::default_delete<Animation>>,
1>              _Objty=std::unique_ptr<Animation,std::default_delete<Animation>>
1>          ]
1>  c:program files (x86)microsoft visual studio 14.0vcincludevector(1286): note: see reference to function template instantiation 'void std::_Wrap_alloc<std::allocator<_Ty>>::construct<std::unique_ptr<Animation,std::default_delete<Animation>>,std::unique_ptr<Animation,std::default_delete<Animation>>&>(_Ty *,std::unique_ptr<Animation,std::default_delete<Animation>> &)' being compiled
1>          with
1>          [
1>              _Ty=std::unique_ptr<Animation,std::default_delete<Animation>>
1>          ]
1>  c:program files (x86)microsoft visual studio 14.0vcincludevector(1285): note: see reference to function template instantiation 'void std::_Wrap_alloc<std::allocator<_Ty>>::construct<std::unique_ptr<Animation,std::default_delete<Animation>>,std::unique_ptr<Animation,std::default_delete<Animation>>&>(_Ty *,std::unique_ptr<Animation,std::default_delete<Animation>> &)' being compiled
1>          with
1>          [
1>              _Ty=std::unique_ptr<Animation,std::default_delete<Animation>>
1>          ]
1>  c:program files (x86)microsoft visual studio 14.0vcincludevector(1278): note: while compiling class template member function 'void std::vector<std::unique_ptr<Animation,std::default_delete<_Ty>>,std::allocator<std::unique_ptr<_Ty,std::default_delete<_Ty>>>>::push_back(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)'
1>          with
1>          [
1>              _Ty=Animation
1>          ]
1>  c:cpproguelikerogueliketurn.cpp(44): note: see reference to function template instantiation 'void std::vector<std::unique_ptr<Animation,std::default_delete<_Ty>>,std::allocator<std::unique_ptr<_Ty,std::default_delete<_Ty>>>>::push_back(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' being compiled
1>          with
1>          [
1>              _Ty=Animation
1>          ]
1>  c:cpproguelikerogueliketurn.cpp(44): note: see reference to class template instantiation 'std::vector<std::unique_ptr<Animation,std::default_delete<_Ty>>,std::allocator<std::unique_ptr<_Ty,std::default_delete<_Ty>>>>' being compiled
1>          with
1>          [
1>              _Ty=Animation
1>          ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

我代码的唯一点出现在长的模板错误链的末尾,是在push_back到AddAnimation的唯一指针向量。

如果我尝试编译简化的案例,即使在动画类中添加自定义构造函数也没有问题:

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <memory>
class Animation
{
    int _animation_value;
public:
    Animation() {};
    Animation(int animation_value)
        : _animation_value(animation_value)
    {}
};
class Turn
{
    std::vector<std::vector<std::unique_ptr<Animation>>> _rounds;
public:
    void addAnimation(std::unique_ptr<Animation> round)
    {
        _rounds.resize(_rounds.size() + 1);
        _rounds[0].push_back(std::move(round));
    }
};
class Other
{
public:
    void foo()
    {
        auto x = std::make_unique<Animation>(7);
        Turn turn;
        turn.addAnimation(std::move(x));
    }
};
int main()
{
    Other other;
    other.foo();        
    return 0;
}

有帮助吗?

您是否在代码中的任何地方都复制转弯类?因为,如评论中所述,辅助功能本身似乎没有错误。因此,也许您生成了整个转弯类都被复制的代码,因此,独特指针的向量要制作副本?