Russian Qt Forum

Программирование => С/C++ => Тема начата: Karl-Philipp от Июль 25, 2008, 10:43



Название: Инициализация новых объектов списка указ
Отправлено: Karl-Philipp от Июль 25, 2008, 10:43
помогите, пожалуйста, разобраться:
есть класс

Код:
class CustomClass 
{
CustomClass(int &k, bool &b);
~CustomClass();
private:
int i;
bool b;
...
}

есть список
Код:
list< Customclass* >cCList;


Список в процессе работы программы заполняется. В какой-то момент список должен заполняться объектами, данные для которых берутся из объектов этого же списка (с помощью итератора).

Код:
list< CustomClass* >::iterator cCIterator = cCList.begin();

cCList.push_back( new CustomClass( (*cCIterator)->k, false ) );

cCList.push_back( new CustomClass( (*cCIterator)->k, (*cCIterator)->b ) );

сомневаюсь, что это правильное заполнение списка  :)

Подскажите, пожалуйста, как надо?


Название: Re: добавление в список указателей на объекты с данными из этого же списка
Отправлено: EhTemka от Июль 25, 2008, 14:19
Цитировать
Список в процессе работы программы заполняется. В какой-то момент список должен заполняться объектами, данные для которых берутся из объектов этого же списка (с помощью итератора).

Code:

Код:
list< CustomClass* >::iterator cCIterator = cCList.begin();

cCList.push_back( new CustomClass( (*cCIterator)->k, false ) );

cCList.push_back( new CustomClass( (*cCIterator)->k, (*cCIterator)->b ) );


сомневаюсь, что это правильное заполнение списка  Smiley

Само заполнение списка правильное, правда всё это как-то странно... Зачем тебе
new CustomClass( (*cCIterator)->k, (*cCIterator)->b ), если он у тебя уже есть (т.е. сам (*cCIterator))?
Но тут канечно вопрос проектирования, может зачем и нужно :)


Название: Re: добавление в список указателей на объекты с данными из этого же списка
Отправлено: Karl-Philipp от Июль 25, 2008, 14:58
...

Само заполнение списка правильное, правда всё это как-то странно... Зачем тебе
new CustomClass( (*cCIterator)->k, (*cCIterator)->b ), если он у тебя уже есть (т.е. сам (*cCIterator))?
Но тут канечно вопрос проектирования, может зачем и нужно :)

извините - завтыкал. Вместо (*cCIterator)->b должно быть определенное значение.
Привожу также конструктор:
Код:
CustomClass::CustomClass(int &k, bool &bValue)
{
     i = k;
     b = bValue;
     ...
}


Меня интересует использование (*cCIterator)->k в
Код:
cCList.push_back( new CustomClass( (*cCIterator)->k, true ) );
Получается, что создается класс, который инициализируется значением из некоторого места в куче. То есть член i инициализируется и уже не будет зависеть от (*cCIterator)->k ??? Так что ли?

Почему спросил:
релизная версия программы работает как надо. При работе дебажной версии появляется ошибка. Отладчиком выследил, что ошибка появляется  в месте заполнения списка.


Название: Re: добавление в список указателей на объекты с данными из этого же списка
Отправлено: Tonal от Июль 25, 2008, 17:23
А зачем у тебя там вообще ссылки в параметрах конструктора?
Ссылки без константности могут быть нужны в двух случаях:
1) В функции изменяется значение фактического параметра - у тебя этого нет в приведённом коде.
2) Одно из полей класса - ссылка, и мы хотим её инициализировать фактическим параметрам - у тебя не этот случай, т.к. это производится в списке инициализации.

Т.е. в данном случае ссылки можно просто убрать из кода. :)


Название: Re: добавление в список указателей на объекты с данными из этого же списка
Отправлено: Karl-Philipp от Июль 25, 2008, 17:37
спасибо, Тонал, убрал ссылки из конструктора, но эффект тот же - дебажная программа валится. Не пойму почему же программа валится при  добавлении объекта в список   ???


Название: Re: добавление в список указателей на объекты с данными из этого же списка
Отправлено: spirit от Июль 25, 2008, 18:37
а  можно  выложить  компилябильный  код? :)


Название: Инициализация новых объектов списка указателей данными из этого же списка
Отправлено: Karl-Philipp от Июль 25, 2008, 19:04
а  можно  выложить  компилябильный  код? :)
в этом случае мне придется выложить весь проект, поскольку с объектами класса происходят всякие преобразования на разных этапах выполнения программы и вряд ли кто захочет перерыть пару тыщ строк, а может и больше  :)

Я уж лучше сам покопаюсь, а потом расскажу про решение проблемы. Похоже, что дело не в списке указателей на объекты, а в том, что инициализирую новый объект данными из несуществующего объекта.

Как-то мне советовали использовать Ассерты, а я пропустил это дело мимо ушей и вот результат - попал, похоже, на знакомые грабли :(


Название: Re: Инициализация новых объектов списка указ
Отправлено: EhTemka от Июль 27, 2008, 22:46
А что пишет дебагер?


Название: Re: Инициализация новых объектов списка указ
Отправлено: Red Devil от Июль 28, 2008, 10:46
Цитировать
сомневаюсь, что это правильное заполнение списка
С виду ничего криминального нет, но есть одно но. У тебя список может быть пусто, когда ты берешь итератор на begin.

Цитировать
в этом случае мне придется выложить весь проект, поскольку с объектами класса происходят всякие преобразования на разных этапах выполнения программы и вряд ли кто захочет перерыть пару тыщ строк, а может и больше 
Возможно преобразования выполнены неверно, поэтому и валится при попытке обращения не к тому участку памяти.

Что за компилятор, кстати ?


Название: Re: Инициализация новых объектов списка указ
Отправлено: Karl-Philipp от Сентябрь 26, 2008, 16:50
компилятор из VS7.0

Да, именно преобразования были выполнены не верно - прочесал всю программу с помощью дебагера раз с тыщу :) - не помогло
Дело в том, что в отдельных объектах создаются списки других объектов, в них то и была ошибка, точнее при обращении к ним.

Короче открыл для себя мир исключений и их обработки в С++ :)