Russian Qt Forum
Ноябрь 23, 2024, 08:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Инициализация новых объектов списка указ  (Прочитано 6602 раз)
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 ) );

сомневаюсь, что это правильное заполнение списка  Улыбающийся

Подскажите, пожалуйста, как надо?
« Последнее редактирование: Июль 25, 2008, 19:12 от terlan » Записан
EhTemka
Гость
« Ответ #1 : Июль 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))?
Но тут канечно вопрос проектирования, может зачем и нужно Улыбающийся
Записан
Karl-Philipp
Гость
« Ответ #2 : Июль 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 Непонимающий Так что ли?

Почему спросил:
релизная версия программы работает как надо. При работе дебажной версии появляется ошибка. Отладчиком выследил, что ошибка появляется  в месте заполнения списка.
Записан
Tonal
Гость
« Ответ #3 : Июль 25, 2008, 17:23 »

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

Т.е. в данном случае ссылки можно просто убрать из кода. Улыбающийся
Записан
Karl-Philipp
Гость
« Ответ #4 : Июль 25, 2008, 17:37 »

спасибо, Тонал, убрал ссылки из конструктора, но эффект тот же - дебажная программа валится. Не пойму почему же программа валится при  добавлении объекта в список   Непонимающий
Записан
spirit
Гость
« Ответ #5 : Июль 25, 2008, 18:37 »

а  можно  выложить  компилябильный  код? Улыбающийся
Записан
Karl-Philipp
Гость
« Ответ #6 : Июль 25, 2008, 19:04 »

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

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

Как-то мне советовали использовать Ассерты, а я пропустил это дело мимо ушей и вот результат - попал, похоже, на знакомые грабли Грустный
« Последнее редактирование: Июль 25, 2008, 19:13 от terlan » Записан
EhTemka
Гость
« Ответ #7 : Июль 27, 2008, 22:46 »

А что пишет дебагер?
Записан
Red Devil
Гость
« Ответ #8 : Июль 28, 2008, 10:46 »

Цитировать
сомневаюсь, что это правильное заполнение списка
С виду ничего криминального нет, но есть одно но. У тебя список может быть пусто, когда ты берешь итератор на begin.

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

Что за компилятор, кстати ?
Записан
Karl-Philipp
Гость
« Ответ #9 : Сентябрь 26, 2008, 16:50 »

компилятор из VS7.0

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

Короче открыл для себя мир исключений и их обработки в С++ Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.104 секунд. Запросов: 21.