Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
AvengerAlive
5 / 5 / 0
Регистрация: 30.07.2011
Сообщений: 257
#1

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

15.01.2012, 17:09. Просмотров 425. Ответов 9
Метки нет (Все метки)

Проблема с указателями в классе дерево.
Есть такой вот класс:
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;
Как можно правильно задать параметры. Очень нужно!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.01.2012, 17:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатели в функциях (C++):

Указатели в функциях (составить программу для проверки, есть ли в массиве одинаковые элементы) - C++
Помогите пожалуйста:scratch: Составить программу для проверки, есть ли в массиве одинаковые элементы. Проверить на наличие одинаковых...

Указатели и указатели на указатели, а также типы данных - C++
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно. Накачал литературы, буду изучать) Щас...

Через указатели на указатели посчитать сумму двух чисел и записать в третье - C++
1. Через указатели на указатели посчитать сумму двух чисел и записать в третье. 2. Написать примитивный калькулятор, пользуясь только...

Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов? - C++
Есть массив int **mas; mas=new int*; // выделил место под пять строк, верно ? mas=new int;// выделил для первой строки матрицы два...

Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной - C++
Мой код. #include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include&lt;iomanip&gt; using namespace std; void min_max(int*pa, int*pb,...

Отсортировать массив и вывести на экран (массивы и указатели на указатели) - C++
Даны массивы F-фамилий студентов и S-результаты сессии (5 оценок) , причем s- результат сессии F студента. Отсортировать массив S по...

9
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
15.01.2012, 17:27 #2
А теперь русским языком: что делает имеющаяся функция, какое поведение хотите получить вы, что означают параметры?
0
retmas
Жарю без масла
864 / 746 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
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)
0
AvengerAlive
5 / 5 / 0
Регистрация: 30.07.2011
Сообщений: 257
15.01.2012, 17:35  [ТС] #4
неважно что делает ф-я. Просто в классе вершины дерева есть указатели на его потомков. Я не хочу писать 2 раза одно и тоже для левого и правого потомка. Хочу в ф-ю подавать сторону и пусть она сама всё делает.
0
retmas
Жарю без масла
864 / 746 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
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;
};
0
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 и работала. Как это сделать?
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 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; выполнится в любом случае.
Я не разбирался, что тут к чему, озвучил проблемные, как мне показалось, места.
0
retmas
Жарю без масла
864 / 746 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
15.01.2012, 17:42 #8
Цитата Сообщение от AvengerAlive Посмотреть сообщение
неважно что делает ф-я.
и как можно помочь написать то, не известно что
0
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 секунды
Я не хочу передать к ф-ии сам элемент. Я просто хочу передать ИМЯ УКАЗАТЕЛЯ, чтобы ф-я потом с ним работала.
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
15.01.2012, 18:29 #10
AvengerAlive, я вам уже сказал. Вы никак не сможете подменить поле, только если явно передадите это поле и будете с ним работать как с обычным указателем, в отделении от того, что он является полем. Т.е. вы должны передавать в функцию конкретный указатель, либо node->left, либо node->right, а в функции работать с ним, а не пытаться в функции подменить некий node->side на node->left или node->right в зависимости от параметра, это невозможно (только через макросы, но это быдлокод).
0
15.01.2012, 18:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.01.2012, 18:29
Привет! Вот еще темы с ответами:

Написать программу сортировки через указатели на указатели - C++
Вот моя программа #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;string&gt; using namespace std; //Сортировка &quot;пузырьком&quot;. ...

Указатели на слонов или А зачем нужны указатели? - C++
Знаю что таких вопросов было уйма, но я так и не нашел ответа на свой вопрос. Для чего нужны указатели? Что такое указатели я знаю, это...

Используются ли на практике указатели на указатели объектов? - C++
Имеются ввиду указатели именно на объекты, а не динамические массивы. Например такой: Object** obj; А как насчёт такого: Object***...

Указатели и массивы. Указатели и функции - C++
Никак не разберусь с указателями на функцию. Пишу в Visual Studio. Надо написать функцию Compress() с использованием указателей, которая...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.