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

Указатели в функциях - C++

Восстановить пароль Регистрация
 
AvengerAlive
5 / 5 / 0
Регистрация: 30.07.2011
Сообщений: 257
15.01.2012, 17:09     Указатели в функциях #1
Проблема с указателями в классе дерево.
Есть такой вот класс:
C++
1
2
3
4
5
6
template <class T> class tree_elem
{
 public:
  T value;
  tree_elem *left,*right,*parent;
};
и общий класс дерева.
в классе дерева пишу ф-ю push.
функция обращается по ходу к вот такой функции
C++
1
2
3
4
5
6
template <class T> bool tree<T>::add_f(tree_elem<T> *pos, tree_elem<T> *pos_s, tree_elem<T> *side)
{
 if (pos_s->side) pos_s=pos_s->side;
 else pos_s->side=pos; pos->parent=pos_s;
 return true;
}
Я хочу, чтобы при вызове add_f(pos,pos_s,left) моя функция работала так:
C++
1
2
3
 if (pos_s->left) pos_s=pos_s->left;
 else pos_s->left=pos; pos->parent=pos_s;
 return true;
Как можно правильно задать параметры. Очень нужно!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.01.2012, 17:27     Указатели в функциях #2
А теперь русским языком: что делает имеющаяся функция, какое поведение хотите получить вы, что означают параметры?
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
15.01.2012, 17:32     Указатели в функциях #3
C++
1
if (pos_s->side) pos_s=pos_s->side;
что за side, откуда он взялся и для чего тогда side в обьявлении
C++
1
add_f(tree_elem<T> *pos, tree_elem<T> *pos_s, tree_elem<T> *side)
AvengerAlive
5 / 5 / 0
Регистрация: 30.07.2011
Сообщений: 257
15.01.2012, 17:35  [ТС]     Указатели в функциях #4
неважно что делает ф-я. Просто в классе вершины дерева есть указатели на его потомков. Я не хочу писать 2 раза одно и тоже для левого и правого потомка. Хочу в ф-ю подавать сторону и пусть она сама всё делает.
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
15.01.2012, 17:38     Указатели в функциях #5
Цитата Сообщение от retmas Посмотреть сообщение
C++
1
if (pos_s->side) pos_s=pos_s->side;
что за side, откуда он взялся
не вижу тут side:
C++
1
2
3
4
5
6
template <class T> class tree_elem
{
 public:
  T value;
  tree_elem *left,*right,*parent;
};
AvengerAlive
5 / 5 / 0
Регистрация: 30.07.2011
Сообщений: 257
15.01.2012, 17:39  [ТС]     Указатели в функциях #6
Цитата Сообщение от retmas Посмотреть сообщение
не вижу тут side:
C++
1
2
3
4
5
6
template <class T> class tree_elem
{
 public:
  T value;
  tree_elem *left,*right,*parent;
};
ну правильно, я хочу не объявлять его там. я хочу чтобы ф-я получала значение left или right и подставляла вместо side и работала. Как это сделать?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.01.2012, 17:42     Указатели в функциях #7
AvengerAlive, ну так и используйте переданный указатель на конкретного потомка.
C++
1
2
3
4
5
6
template <class T> bool tree<T>::add_f(tree_elem<T> *pos, tree_elem<T> *pos_s, tree_elem<T> *side)
{
 if (side) pos_s=side;
 else side=pos; pos->parent=pos_s;
 return true;
}
Только вызывать придётся так: add_f(pos, pos_s, pos_s->left);
И ещё пара моментов:
1. В выражении pos_s=side; pos_s реально не меняется, потому что когда передаётся указатель, поменять можно только значение по указателю, а не сам указатель. Чтобы поменять сам указатель, нужно передавать указатель на указатель.
2. В else находится только выражение side=pos; Выражение pos->parent=pos_s; выполнится в любом случае.
Я не разбирался, что тут к чему, озвучил проблемные, как мне показалось, места.
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
15.01.2012, 17:42     Указатели в функциях #8
Цитата Сообщение от AvengerAlive Посмотреть сообщение
неважно что делает ф-я.
и как можно помочь написать то, не известно что
AvengerAlive
5 / 5 / 0
Регистрация: 30.07.2011
Сообщений: 257
15.01.2012, 18:25  [ТС]     Указатели в функциях #9
Вы меня опять таки не поняли. Не знаю как это ещё написать. Вот есть допустим не дерево, а двусвязный список. У его вершины есть 2 ссылки: вперёд и назад. Я не хочу рассматривать в своём коде 2 случая. Допустим мне надо сделать соседние эл-ты списка равными -1. Я же разумно напишу ф-ю где скажу, что pos->side->value=-1; а потом вызову её для side=left и side=right. Вот и тут точно так же. Код громоздкий когда получается с деревом, не хочется постоянно рассматривать левый и правый потомки поотдельности. Хочется написать код с одной ссылкой, чтобы потом он понимал. Так вот вопрос как это записать.

Добавлено через 44 секунды
Я не хочу передать к ф-ии сам элемент. Я просто хочу передать ИМЯ УКАЗАТЕЛЯ, чтобы ф-я потом с ним работала.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.01.2012, 18:29     Указатели в функциях
Еще ссылки по теме:

Ошибка в функциях с++ C++
Окончание W и A в функциях C++
C++ Написать программу сортировки через указатели на указатели

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.01.2012, 18:29     Указатели в функциях #10
AvengerAlive, я вам уже сказал. Вы никак не сможете подменить поле, только если явно передадите это поле и будете с ним работать как с обычным указателем, в отделении от того, что он является полем. Т.е. вы должны передавать в функцию конкретный указатель, либо node->left, либо node->right, а в функции работать с ним, а не пытаться в функции подменить некий node->side на node->left или node->right в зависимости от параметра, это невозможно (только через макросы, но это быдлокод).
Yandex
Объявления
15.01.2012, 18:29     Указатели в функциях
Ответ Создать тему
Опции темы

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