Я новичок в 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. Мне было интересно, пропускаю ли я что-то для определения класса, или я как-то испортил типы данных, или ссылки на указатели. Существует также проблема с выводимыми значениями, если я пытался нетривиально манипулировать им с помощью функции обновления.
Я даже пытался вместо этого передать вектор указателей (классу) в функцию обновления; У меня все еще есть проблемы с вставкой новых элементов в вектор. Этот сайт очень помог мне узнать структуру класса и его указатели.
Спасибо за чтение этой длинной проблемы.