Работа с вектором класса - PullRequest
3 голосов
/ 21 июля 2011

Я новичок в C ++, и я только начинаю работать с контейнером, называемым классами.

Я работаю над программой, в которой объект определен и хранится внутри вектора.

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

Это "car.h"

#ifndef CAR_H_GUARD
#define CAR_H_GUARD

class car{

    int v;//the velocity 
    int loc;//location

public:

    //default constructor, copy constr., cp. assgnmt. optr., destructor
    car();
    car(const car& j);
    car& operator=(const car& j);
    ~car();

    void set_v(int);    //sets velocity 
    void set_pos(int);  //sets position

    int get_v (){return((v));}//returns velocity
    int get_pos(){return(loc);}//returns position

};
#endif

Это "car.cpp"

#include "car.h"
#include <iostream>

using namespace std;

//constructor
car::car() {

    v=1;
    loc=0;

}

//copy constructor
car::car(const car& j){

    v=j.v;
    loc=j.loc;

}

//copy assignment operator

car& car::operator=(const car& j){

    v=j.v;
    loc=j.loc;

    return *this;

}

//destructor
car::~car () {

    delete &v;
    delete &loc;

}

//sets velocity
void car::set_v(int p){

    v = p;

}

//sets position
void car::set_pos(int l){

    loc = l;

}

Я попытался создать «конструктор перемещения» с помощью оператора назначения копирования. Это для следующего кода, включающего вектор моих объектов для работы.

#include "main.h"
#include "car.h"
#include <iostream>
#include <vector>

using namespace std;

//update car position
void update (vector <car> &cr){

    //changes state of cars, eg.
    for (int c = 0; c<cr.size();c++){
        cr[c].set_v(1);
        cr[c].set_pos(100);
    }

}

int main(){

    //a vector of cars
    vector<car> cat;

    car j;
    j.set_v(100);
    j.set_pos(99);
    cat.push_back(j);

    //new cars enters the road
    j.set_v(120);
    j.set_pos(77);
    cat.push_back(j);

    j.set_v(80);
    j.set_pos(55);
    cat.push_back(j);

    //updating cars
    update(cat);

    //output
    for (int i = 0; i<cat.size(); i++){

        cout << cat[i].get_v()<<" is the velocity of car "<<i<<".\n";
        cout << cat[i].get_pos()<<" is the position of car "<<i<<".\n";

    }
}

И я получаю следующую ошибку, которую я посмотрел в Internetz.

main (8852) malloc: * * * ошибка для объекта 0x7fff5fbff630: освобожденный указатель не выделен * * * установить точку останова в malloc_error_break для отладки Отключить ловушку

Хотя это может быть несовместимость компилятора (я писал в Xcode ... и использую g ++, на mac 10.6.8 ...), однако код выдает результат, когда в векторе есть только одна машина. Когда я пытался представить другие автомобили, я получаю только ошибку malloc. Мне было интересно, пропускаю ли я что-то для определения класса, или я как-то испортил типы данных, или ссылки на указатели. Существует также проблема с выводимыми значениями, если я пытался нетривиально манипулировать им с помощью функции обновления.

Я даже пытался вместо этого передать вектор указателей (классу) в функцию обновления; У меня все еще есть проблемы с вставкой новых элементов в вектор. Этот сайт очень помог мне узнать структуру класса и его указатели.

Спасибо за чтение этой длинной проблемы.

1 Ответ

2 голосов
/ 21 июля 2011

Каждый использует delete только на вещах, где он использовал new. Вы никогда delete что-то, что не было выделено отдельно new. Эти строки в вашем Car деструкторе ... очень разрушительны (простите за каламбур):

delete &v;
delete &loc;

Удалите эти строки - они совершенно не нужны и являются источником вашей проблемы. Почти единственный раз, когда вы используете delete в деструкторе, это когда вы используете new для выделения объекта в вашем конструкторе - или когда указатель на объект передается вашему конструктору с пониманием того, что Ваш объект отвечает за удаление указателя при его разрушении.

...