ошибка при стирании объекта в векторе. Как добавить операторы присваивания перемещения в мои классы? - PullRequest
0 голосов
/ 20 апреля 2019

Я получаю сообщение об ошибке, когда пытаюсь стереть объект из моего вектора

Google, но я не могу понять, в чем дело.Исходя из того, что я собрал, я правильно вызываю функцию стирания, но мне нужно предоставить оператор присваивания перемещений моим классам?

моей функции, где я вызываю стирание

void removegroup(const short &group){
switch (tracker[group].group){
    case 0: {
        guardvec.erase(guardvec.begin()+tracker[group].position); //this is the problem it compiles just fine if i comment out this line
        //guardvec.erase(remove(guardvec.begin(), guardvec.end(), tracker[group].position),guardvec.end()); //tried this and it doesnt work
    }

        break;
}
for (short counter=0;counter<tracker.size();counter++)
    if ((tracker[counter].group==tracker[group].group)&&(tracker[counter].position>tracker[group].position))
        tracker[counter].position=tracker[counter].position--;
}

моего класса

class guardhitdice {
    friend class guard;
    short const times = 2, dice = 8, plus = 2;
};

class guard : private guardhitdice {
private:
    short units, XP, morale, totalHP=0, dead=0, wounded=0;
    short* HP = new short[units];
public:
    void showstats(){
        std::cout << "STR=1, DEX=1, CON=1, INT=0, WIS=0, CHA=0, Perception=2, Passive Perception=12"<<std::endl
        <<"current xp: "<<XP<<"total HP across units: "<<totalHP<<"casualties: "<<dead<<"wounded: "<<wounded;
    }
    void initializeHP(){
        for (short counter=0; counter<units-1; counter++){
            HP[counter]=plus + D(times, dice);
            totalHP+=HP[counter];
        }
    }
   guard(const short &xp, short &Units, short &Morale){
       XP=xp;
       units=Units;
       morale=Morale;
      // short* HP = new short[units];
       initializeHP();
   }
    ~guard(){
        delete HP;
    }

};

вот моя ошибка компилятора https://pastebin.com/KSniFkVD он должен быть в состоянии удалить объект в tracker [group] .position.Кстати, позиция короткая, я также пытался добавить это к своим классам, но они не работают

guardhitdice& guardhitdice ::operator=(guardhitdice&&);
  guard& guard ::operator=(guard&&);

это работает, если я делаю это для нормальных векторов, но не для векторов объектов

1 Ответ

2 голосов
/ 20 апреля 2019

Ваша проблема может быть уменьшена до

#include <vector>

class test{
    short const times = 2;
};

int main()
{
    std::vector<test> t;
    t.push_back(test{});
    t.erase(t.begin()); //<-- BAM!
}

Пример: https://ideone.com/MlwUyI

vector много копирует и присваивает. Копирование это круто, но тест содержит const член. Вы не можете изменить const переменную, поэтому вы не можете назначить ее.

Но поскольку он инициализируется литералом и нет конструктора, который позволял бы инициализировать значение чем-то другим, все экземпляры test будут иметь одинаковое значение. Это очень хорошо подходит для static. static переменные не участвуют в присваивании, поэтому можно использовать оператор присваивания по умолчанию.

class test{
    static short const times = 2;
};

Пример: https://ideone.com/npUi4B

...