Я относительно новичок в C++, и у меня возникла проблема, которую я не смог решить. Точная ошибка, которую я получаю:
Исключение из первого шанса в 0x760d34c5 в Pg1_raycast_nabrown3.exe: 0xC0000005: место чтения нарушения доступа 0x0e296575. Необработанное исключение в 0x760d34c5 в Pg1_raycast_nabrown3.exe: 0xC0000005: место для чтения нарушения доступа 0x0e296575.
Они создаются, когда я пытаюсь получить доступ к переменной экземпляра вектора. Вот код:
group.h
class Group {
private:
string name;
vector<Face*> members;
Material* material;
public:
Group(string n);
~Group();
void addFace(Face* f);
string getName();
vector<Face*> getMembers();
void setMaterial(Material * mat);
Material* getMaterial();
};
group.cpp
// Constructor
Group::Group(string n) {
name = n;
}
// Deconstructor
Group::~Group() {}
/**
* addFace
*
* adds the provided face to this group
*/
void Group::addFace(Face* f) {
// DEBUGGING
OutputDebugStringA("A\n");
OutputDebugStringA("A " + members.size());
members.resize(members.size() + 1);
OutputDebugStringA("B\n");
OutputDebugStringA("B " + members.size());
members.push_back(f);
}
Операторы отладки распечатывают только один "А", поэтому он разбивается на первый вызов members.size(). Функция addFace() вызывается из другого класса, но я не думаю, что это должен быть соответствующий код. Ничто иное не взаимодействует с вектором-членами.
Любая помощь приветствуется.
EDIT: Очевидно, мои попытки отладочных заявлений вызывают больше проблем. Я хочу отметить, что даже удаление операторов отладки, которые вы указали как ошибочные, я по-прежнему получаю исходную ошибку.
void Group::addFace(Face* f) {
// DEBUGGING
OutputDebugStringA("A\n");
members.push_back(f);
// DEBUGGING
OutputDebugStringA("B\n");
}
Вы не можете конкатенировать строки, подобные этому в c++. "A " + members.size()
является неправильной арифметикой указателя.
Вы должны создать std::string
из "A "
и преобразовать members.size()
в std::string
, так что эта строка должна выглядеть так:
OutputDebugString((std::string("A ") + std::to_string(members.size())).c_str());
Для этого вам нужно будет #include <string>
.
OutputDebugString
не примет std::string
в качестве аргумента, хотя остальные ваши точки верны. Правильное использование будет OutputDebugString((std::string("A ") + std::to_string(members.size())).c_str());
resize()
добавляет новые построенные объекты по умолчанию к вектору, если он должен расти. Вы, вероятно, хотите, чтобыreserve()
вместо этого.OutputDebugString
? Результатmembers.size()
- это неstring
или строковый литерал, а целочисленное значение, поэтому"A " + members.size()
может привести к странному поведению. Предпочитаю что-то вроде"A " + std::to_string(members.size())