Очень простой вопрос — как я могу получить доступ к данным для структуры, которая живет внутри кучи?
Дополнительная информация :: У меня есть класс с именем «A» и структура внутри этого класса с именем «B». Каждый созданный «Б» будет жить в куче. Предполагается, что класс «A» имеет вектор «B» в качестве частного элемента данных (т. Е. Класс «A» может содержать много «B»). У меня есть метод в классе «A», который добавит еще один новый экземпляр «B» в векторе, который имеет «A». У меня также есть другой метод в классе «A», который будет обновлять каждый элемент, который находится в векторе экземпляров «B». Мои вопросы:
Как использовать методы получения и установки в моей структуре?
Вот некоторый код, который может помочь (примечание: grafix.h — графическая библиотека)
//.h file
#pragma once
#include <vector>
#include "grafix.h"
class A
{
public:
~A();
A();
void addB();
void updateB();
private:
struct B
{
public:
~B()
{
delete p_b;
p_b = 0;
}
B()
{
p_b = new B; //I need this here
p_ball->x = 0;
p_ball->y = 0;
p_ball->r = 15;
}
void setxy(int X, int Y)
{
//What does this look like?
//This?
x = X; //?
y = Y;
}
int retx()
{
//Likewise.... ?
return x; //?
}int rety()
{
return y;
}
void update()
{
draw();
//Movement code taken out for time being
}
private:
int x,y; //xy
int r; //radiusB* p_b; //pointer to object, do I need this?
void draw()
{
draw_circle_filled(x,y,r);
//how can I access the data within the struct B here?
//do I use the getters/setters? dereference??
}
};
vector <Ball*> bs; //Holds all of the B's that have been created
};
И затем .cpp файл, который имеет методы. Здесь у меня есть вопрос, набираю ли я правильный синтаксис ??
#include "A.h"
A::A()
{
addB();
}
void A::addB()
{
B* b;
bs.push_back(b);
}
void A::updateB()
{
for(int i = 0; i < bs.size(); i++)
{
bs[i]->update();
}
}
это преступник :
void A::addB()
{
B* b;
bs.push_back(b);
}
B * b НЕ инициализируется.
Наличие ссылки на него в вашем контейнере преступно: разыменование этого адреса не имеет смысла и является неопределенным поведением / падением.
Вы должны назначить этот путь:
{
B* b = new B;
bs.push_back(b);
}
редактировать: как Кевин прокомментировал ниже, как есть утечка памяти. Вы бы предпочли использовать контейнер std::shared_ptr<B>
, Таким образом, объект B будет удален, когда никто не будет указывать на него shared_ptr.
Других решений пока нет …