Я хочу сохранить список объектов 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 все обнуляется и выглядит так, как будто я использовал бы конструктор по умолчанию вместо этого.
Я делаю что-то неправильно? Мой подход правильный?
Спасибо вам!
РЕДАКТИРОВАТЬ: ПРОГРАММА РЕДАКТИРОВАТЬ ДЛЯ ЯСНОСТИ
Изменение:
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);
Должен решить вашу проблему.
Вы можете попытаться инициализировать ваш p_A перед разыменованием его.
std::list<B> Blist;
Это list
из объекты типа B. Когда вы insert(iterator,value)
вы даете списку значение для копирования. Это создает новый B
объект для хранения списком, который создается конструктором копирования. Если B
copy ctor не выполняет необходимых шагов инициализации, объект не будет в ожидаемом вами состоянии.
std::list<B*> Blist;
Ведение списка указатели вместо объекты позволит A
доступ к объекту B
элемент, который уже был создан, а не создание нового B
объект, который живет в списке.