Список STL и классы друзей — Не получить желаемый результат

Я хочу сохранить список объектов B в классе A, но я хочу, чтобы при вызове конструктора B в списке A создавался новый элемент.

У меня есть такой код:

class A
{...
protected:
std::list<B> Blist;
std::list<B>::iterator Bit;
...
public:
Update();
...
friend class B;
}class B
{...
protected:
A* p_A;
...
public:
B(); //Standard constructor
B(A* pa); // This is the constructor I normally use
}B::B(A* pa)
{
p_A=pa; // p_A Initialization

p_A->Bit = p_A->Blist.insert(p_A->Blist.end(), *this);
}

A::Update()
{

for(Bit=Blist.begin(); Bit != Blist.end(); Bit++)
{
(*Bit).Draw() //Unrelated code
}

}

void main() //For the sake of clarity
{

A* Aclass = new A;
B* Bclass = new B(A);

Aclass.Update(); // Here is where something goes wrong; current elements on the list are zeroed and data missed

}

Ну, программа без труда компилируется, но когда я запускаю программу, я не получаю желаемого результата.

Для B у меня есть два конструктора, один по умолчанию, который обнуляет все, и другой, который принимает входные данные для инициализации внутренних переменных.

Когда я использую второй для инициализации частных переменных, то во время метода A.Update все обнуляется и выглядит так, как будто я использовал бы конструктор по умолчанию вместо этого.

Я делаю что-то неправильно? Мой подход правильный?

Спасибо вам!

РЕДАКТИРОВАТЬ: ПРОГРАММА РЕДАКТИРОВАТЬ ДЛЯ ЯСНОСТИ

-1

Решение

Изменение:

std::list<B> Blist;
std::list<B>::iterator Bit;

в

std::list<B*> Blist;
std::list<B*>::iterator Bit;

а также

p_A->Bit = p_A->Blist.insert(p_A->Blist.end(), *this);

в

p_A->Bit = p_A->Blist.insert(p_A->Blist.end(), this);

Должен решить вашу проблему.

0

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

Вы можете попытаться инициализировать ваш p_A перед разыменованием его.

2

std::list<B> Blist;

Это list из объекты типа B. Когда вы insert(iterator,value)вы даете списку значение для копирования. Это создает новый B объект для хранения списком, который создается конструктором копирования. Если Bcopy ctor не выполняет необходимых шагов инициализации, объект не будет в ожидаемом вами состоянии.

std::list<B*> Blist;

Ведение списка указатели вместо объекты позволит A доступ к объекту B элемент, который уже был создан, а не создание нового B объект, который живет в списке.

1
По вопросам рекламы [email protected]