2016-11-26 3 views
0

У меня есть цикл, который выглядит следующим образом:Удаление объекта из вектора по индексу

for (int i = Particles.size() - 1; i >= 0; i--) { 
    if (Particles[i].Dead) { 
     Particles.erase(Particles.begin() + i); 
    } 
} 

Когда я компилирую, я получаю эту ошибку:

Error C2280 'Particle &Particle::operator =(const Particle &)': attempting to reference a deleted function
Gravity C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\xutility 2518

Кто-нибудь знает, что я делать не так? Вот код частиц.

Заголовочный файл

class Particle 
{ 
public: 
    const float G = 6.674 * pow(10, -11); 
    float Mass, Radius; 
    Vector2 Position, Velocity, Force; 
    bool Dead = false; 

    void Gravity(Particle Particle2); 
    void Move(); 
    void Draw(SDL_Surface *Surface, Uint32 Color); 

    Particle(float MassBounds[2], Vector2 PositionBounds[2], float Density); 
    Particle::Particle(float Mass, Vector2 Position, float Density, bool NonRandom); 
    Particle(); 
}; 

Исходный файл

void Particle::Gravity(Particle Particle2) 
{ 
    float GravityMagnitude = (Particle::G*Mass*Particle2.Mass)/Vector2::DistanceSquared(Position, Particle2.Position); 
    Force += (Particle2.Position - Position).Normalised()*GravityMagnitude; 
} 

void Particle::Move() 
{ 
    Velocity += Force/Mass; 
    Position += Velocity; 
} 

void Particle::Draw(SDL_Surface *Surface, Uint32 Color) 
{ 
    if (int(Radius) > 0) { SDLDrawFilledCircle(Surface, int(Position.x), int(Position.y), Radius<1?1:int(Radius), Color); } 
} 

Particle::Particle(float MassBounds[2], Vector2 PositionBounds[2], float Density) 
{ 
    Mass = RandRange(MassBounds); 
    Position = Vector2(RandRange(PositionBounds[0].x, PositionBounds[1].x), RandRange(PositionBounds[0].y, PositionBounds[1].y)); 
    Radius = pow((3.0 * Mass)/(4 * M_PI*Density), 1.0/3.0); 
    Velocity = Vector2(); 
    Force = Vector2(); 
} 
Particle::Particle(float Mass, Vector2 Position, float Density, bool NonRandom) 
{ 
    this->Mass = Mass; 
    this->Position = Position; 
    Radius = pow((3.0 * Mass)/(4 * M_PI*Density), 1.0/3.0); 
    Velocity = Vector2(); 
    Force = Vector2(); 
} 
Particle::Particle() 
{ 
    Mass = 1; 
    Position = Vector2(); 
    Radius = 1; 
    Velocity = Vector2(); 
    Force = Vector2(); 
} 

inline bool operator==(const Particle& a, const Particle& b) { return a == b; } 
+0

Вы что-то не могло быть и речи. В сообщении об ошибке указано, что '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '', ' –

+0

У объектов в C++ нет операторов по умолчанию = и ==? Я думал, что они сделали, но, пожалуйста, поправьте меня, если я ошибаюсь, так как я не думал, что мне понадобится один, так как я не буду делать специальное сравнение или установить – QFSW

+0

Оператор присваивания (operator =) определяется автоматически и должен быть явно удален. Оператор равенства (operator ==) никогда не определяется по умолчанию. –

ответ

0

Вы можете лучше удачи, используя remove_if и стирать:

#include <algorithm> 
#include <iostream> 
#include <vector> 

using namespace std; 

struct Vector { 
    int x; 
    int y; 
}; 

bool is_negative (Vector a) { 
    return a.x < 0 && a.y < 0; 
} 

int main() { 
    vector<Vector> vectors; 
    vectors.push_back({-1, -2}); 
    vectors.push_back({-1, 2}); 
    vectors.push_back({1, 2}); 
    vectors.push_back({-1, -2}); 
    vectors.erase(
     std::remove_if(vectors.begin(), vectors.end(), is_negative), 
     vectors.end()); 

    for (auto v : vectors) { 
     cout << v.x << " " << v.y << endl; 
    } 
} 
+1

Можете ли вы объяснить, что означает ошибка в вопросе, и как это помогает? –

+0

Пробовал это, все та же ошибка :( Хотя я согласен, что если мы заставим их работать, это будет лучший подход – QFSW

-1

Я не мог заметить это в ваш цикл for:

Particles.erase(Particles.begin() + i-1) 

Что еще более важно

i - 1 

Вы начинаете с

i = Particles.size() - 1 

и не останавливаться до тех пор, пока

i < 0 

Это

Particles.begin() 

дает вам главу списка.
Когда

i == 0 

Particles.begin() + (i - 1) 

будет пытаться получить неверный узел.
Что переводится

Particles.begin() - 1 

Я не знаю, когда ваши перерывы кода, я иду на основе вашего цикла

Вот ссылка ж/док http://www.cplusplus.com/reference/vector/vector/erase/

Надеется, что это помогает

+0

Я изменил его на i, и он по-прежнему имеет ту же ошибку – QFSW

Смежные вопросы