Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Fobes
16 / 16 / 2
Регистрация: 19.09.2012
Сообщений: 212
#1

Проблема с указателем на элемент вектора - C++

15.07.2015, 16:38. Просмотров 899. Ответов 54
Метки нет (Все метки)

Всем доброго времени суток. Не могу никак выкрутиться)
Допустим, у нас есть класс "А" с параметрами:
C++
1
    std::vector <TNode*> nodes;
И есть зависимый от него класс "В" с параметрами:
C++
1
    TNode* firstNode;
В классе "В" сохранен указатель на элемент класса "А". Но элементы можно удалять независимо друг от друга. При удалении объекта класса "В" нет никаких проблем. Но при удалении объекта класса "А" (delete по вектору) указатель в классе "В" невозможно разыменовать и прога падает.
TNode:
C++
1
    int getBaseY(){return *this->baseY;}
Как быть, чет не приходят идеи в голову
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.07.2015, 16:38     Проблема с указателем на элемент вектора
Посмотрите здесь:

Список с указателем на последний элемент C++
Наибольший элемент вектора C++
C++ Извлечь элемент из вектора
Проблема с указателем на строку C++
C++ Переделать функцию c указателем на int, на функцию с указателем на void
C++ Найти наибольший элемент вектора
Определить количество положительных элементов вектора С(10) и заменить этим значением минимальный элемент вектора А(5) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
16.07.2015, 16:41     Проблема с указателем на элемент вектора
  #41

Не по теме:

Avazart, это не присваивание.

Добавлено через 1 минуту

Цитата Сообщение от Avazart Посмотреть сообщение
if(boost::shared_ptr<int> spt = ref.lock())/* "=" ?? */
Аналог:
C++
1
if(boost::shared_ptr<int> spt(ref.lock()))

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
16.07.2015, 16:50
  #42

Не по теме:

Мм и не смущает конструирование в if ? Как по мне, как минимум непривычно.
Я бы скорее использовал expired().

DrOffset
16.07.2015, 16:57
  #43

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
Мм и не смущает конструирование в if ? Как по мне, как минимум непривычно.
"Это так и задумано" (с). Цель этого намеренно сузить область видимости переменной, дабы исключить ее случайное применение. Очевидно, что нулевой пойтер нельзя разыменовывать, поэтому нет смысла оставлять видимость переменной после условия. Когда такое происходит в for, то вопросов же не возникает:
C++
1
2
3
4
for(int i = 0; i < 10; ++i)
//vs
int i;
for(i = 0; i < 10; ++i)
Как раз таки второе - это сишный подход. А первое - С++. В if тоже самое.

Avazart
16.07.2015, 16:59
  #44

Не по теме:

Я ему про Фому ...

DrOffset
16.07.2015, 17:07
  #45

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
Я ему про Фому ...
Я просто объяснил зачем это сделано.
А Фома - это "непривычно"? Ну так это нестрогое понятие. Кому-то и std:: непривычно и т.п. Что ж теперь не пользоваться std::?
В языке эта возможность существует именно для таких случаев, не вижу причин почему ее нужно игнорировать.

А случайное присваивание в if уже давно диагностируется всеми современными компиляторами, если предупреждения не отключать совсем.

Avazart
16.07.2015, 17:13
  #46

Не по теме:

Фома это читаемость/понятность кода.

DrOffset
16.07.2015, 17:19
  #47

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
Фома это читаемость/понятность кода.
Это субъективная шкала.

Avazart
16.07.2015, 17:33
  #48

Не по теме:

И все же конструировать объект раньше времени что бы только "проверить"...

Цитата Сообщение от DrOffset Посмотреть сообщение
Это субъективная шкала.
Да и никто не говорил что так строго запрещено делать...

DrOffset
16.07.2015, 17:43
  #49

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
И все же конструировать объект раньше времени что бы только "проверить"...
В смысле раньше времени?
Этот код полностью эквивалентен такому, за исключением области ивдимости spt
C++
1
2
3
4
5
6
    boost::shared_ptr<int> spt = ref.lock();
    if(spt)
    {
        //........
    }
    // тут spt все еще доступна
В остальном код полностью эквивалентный. Никого "раньше времени" нет и в помине.

Avazart
16.07.2015, 17:51
  #50

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
за исключением области ивдимости spt
И ясности, как по мне тут область не так уж важна.

А вообще я про это:
C++
1
2
3
4
if(!ref.expired())
{
    // use  ref.lock();
}

DrOffset
16.07.2015, 17:55
  #51

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
И ясности, как по мне тут область не так уж важна.
Мы оба понимаем, что это холиварная тема. Предлагаю на этом на эту тему закончить.

Цитата Сообщение от Avazart Посмотреть сообщение
А вообще я про это:
Не заметил как ты перевел фокус на другой аспект. С этим соглашусь.

Avazart
16.07.2015, 17:56
  #52

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
Не заметил как ты перевел фокус на другой аспект. С этим соглашусь.
Как другой? Все тот же конструктор в if это странно...

DrOffset
16.07.2015, 18:02
  #53

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
С этим соглашусь.
Но с оговоркой, код c expired потребует дополнительной синхронизации в многопоточном окружении. Объект может протухнуть сразу после проверки, но до первого обращения к нему.



Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
Как другой? Все тот же конструктор в if это странно...
Мой код более универсален и применим в многопточной среде. Если элементы вектора чистятся из другого потока.
Но для учебного примера можно было бы и обойтись expired, с этим я согласен.
Все остальное - твои субъективные ощущения насчет читаемости.

Avazart
16.07.2015, 18:08
  #54

Не по теме:

В многопоточной среде стоит будет пересмотреть полностью всю программу.
Т.е обычно это означает что почти весь код в уйдет в мусорку.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2015, 18:12     Проблема с указателем на элемент вектора
Еще ссылки по теме:

В чем разница между указателем и указателем на указатель? C++
C++ Проблема с указателем на функцию
C++ Указатель на элемент вектора
C++ Изменение вектора. Наибольший элемент вектора

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
DrOffset
16.07.2015, 18:12     Проблема с указателем на элемент вектора
  #55

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
В многопоточной среде стоит будет пересмотреть полностью всю программу.
Автор заявил на первой странице, что не хочет ничего переписывать. Код выше был предложен в контексте этого желания.
Опять же, универсальное решение я писал на автомате. Потому что в подкорке срабатывает триггер на все возможные проблемы. В том числе и по сопровождению, когда кто-то, не до конца разобравшись, вызывает разыменование нулевого указателя ниже по коду.
То, что это избыточно для учебного примера - я понимаю, и замечание по поводу избыточности принял. Все остальное - это твоя субъективная оценка, с ней я соглашаться не буду.

Yandex
Объявления
16.07.2015, 18:12     Проблема с указателем на элемент вектора
Ответ Создать тему
Опции темы

Текущее время: 17:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru