Как выглядят геттеры и сеттеры для структуры (которая живет в куче)?

Очень простой вопрос — как я могу получить доступ к данным для структуры, которая живет внутри кучи?

Дополнительная информация :: У меня есть класс с именем «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();
}
}

3

Решение

это преступник :

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.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector