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

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

Войти
Регистрация
Восстановить пароль
 
Demion84
0 / 0 / 0
Регистрация: 13.02.2013
Сообщений: 9
#1

Вывод вектора указателей - C++

22.08.2015, 16:31. Просмотров 387. Ответов 8
Метки нет (Все метки)

Всем доброго времени суток. Есть такая проблема, пытаюсь написать шаблонный класс для древовидной структуры:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template <class T>
 
class Tree
{
      public:
             Tree();
             ~Tree();
             void print();          // функция вывода содержимого контейнера  
      
      protected:
                
                
                struct Node           
                {
                       T item;        
                       vector<Node*> next;    
                };
                
                vector<Node*> head;
 
};
с созданием дерева и помещением туда данных проблем нет.
проблема именно с выводом. Пытаюсь вывести данные используя итератор вектора:


C++
1
2
3
for (vector<Node*>::iterator iter = head.begin(); iter != head.end(); iter++)
     {
        cout << (*iter)-> item << endl; }
ругается:
59 C:\CPP\Employee\Tree.cpp expected `;' before "iter"
59 C:\CPP\Employee\Tree.cpp `iter' undeclared (first use this function)

Уже всю голову сломал. Подскажите, что может быть не так....
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.08.2015, 16:31
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Вывод вектора указателей (C++):

Удаление указателей из вектора - C++
Что то голова совсем не варит под вечер, подскажите, вот есть у меня вектор хранящий указатели на объекты, ежли я вызову erase насколько...

Создать копию вектора указателей - C++
Есть вектор указателей на мой класс: vector &lt;TreeSet*&gt; tree_set_list; Каждый класс содержит еще вектора с другими классами... в общем...

Сохранение в файл вектора указателей - C++
Здравствуйте. Помогите, пожалуйста, советами - как правильно сохранить на диск четыре вектора указателей на произвольные типы. Дело в...

Запись вектора строк в массив указателей на тип char - C++
Решаю задачу 4.34 из книги Липпмана С. Язык программирования С++. Вводный курс. 4-е изд. Задание: 1) Напишите программу, читающую...

Напишите программу, присваивающую значения элементов списка указателей на символьные строки в стиле С (тип char* ) элементам вектора строк - C++
Напишите программу, присваивающую значения элементов списка указателей на символьные строки в стиле С (тип char* ) элементам вектора строк...

Вывод контейнера указателей через потоковый итератор - C++
Доброго дня всем. Собственно: std::list&lt;int*&gt; list; list.push_back(new int(45)); list.push_back(new int(78)); ...

8
Ryder95
9 / 9 / 4
Регистрация: 24.10.2013
Сообщений: 216
22.08.2015, 16:34 #2
А iter - указатель?

Добавлено через 24 секунды
Если да, то тогда нужно убрать звёздочку перед iter
0
Evgenii Kushner
12 / 12 / 7
Регистрация: 12.08.2015
Сообщений: 55
22.08.2015, 16:59 #3
Это точно дерево а не стэк?
И наверное ошибка тут
C++
1
           cout << (*iter)-> item << endl; }
Мне как бы не понятно как это будет работать это какая-то смесь двух идентичных записей.
C++
1
2
          (*iter).item       // тоже самое что iter->item
           iter->item       // тоже самое что (*iter).item
0
Demion84
0 / 0 / 0
Регистрация: 13.02.2013
Сообщений: 9
22.08.2015, 17:11  [ТС] #4
В строчке
C++
1
 cout << (*iter)-> item << endl; }
как раз ошибки не выдаёт пока. ошибка именно в условии цикла. почему то не хочет определятся итератор. Может быть для шаблонных классов есть какие то нюансы в симантике.

а насчёт

(*iter)-> item

iter это указатель на вектор указателей типа Node. Разыменовываем iter и получаем указатель на объект класса. А далее уже добираемся до поля item.

Нашёл на простора интернета вот такой код:
C++
1
2
3
4
for(size_t i = 0; i < head.size(); i++)
   {
       cout << head[i]->item << endl;
   }
Он почему то без проблем всё выводит. А что у меня не так, так и не пойму....
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6967 / 3258 / 327
Регистрация: 04.12.2011
Сообщений: 9,016
Записей в блоге: 5
22.08.2015, 17:18 #5
Кажется так:
*Iter - достучались до указателя на Node
**Iiter- достучались до Node
то есть лучше бы:
(**Iter).Item
Попробуйте.
0
Tulosba
:)
Эксперт С++
4705 / 3240 / 297
Регистрация: 19.02.2013
Сообщений: 9,046
22.08.2015, 20:01 #6
Цитата Сообщение от Demion84 Посмотреть сообщение
А что у меня не так, так и не пойму....
Минимальный текст программы, которая даёт упомянутую ошибку увидеть можно?
По предоставленным отрывкам не совсем ясно в чем дело.
0
Demion84
0 / 0 / 0
Регистрация: 13.02.2013
Сообщений: 9
23.08.2015, 04:50  [ТС] #7
Программы пока как таковой нет. Есть желание именно разработать класс дерева.

Пока что написал вот что:

Заголовочный файл Tree.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# ifndef TREE
# define TREE
 
#include <vector>
# include <iterator>
 
using namespace std;
 
 
template <class T>
 
class Tree
{
      public:
             Tree();
             ~Tree();
 
             void push_node (const T& newNode);  // Запихиваем элемент
      
             void print();            //  Вывод на экран      
      
      protected:
                
                
                struct Node           // элемент контейнера
                {
                       T item;        // данные
                       vector<Node*> next;    // узел дерева
                };
                
                vector<Node*> head;           // поле класса
 
};
#endif
Файл Tree.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# include <iostream>
# include "Tree.h"
 
 
template <class T> void Tree<T>::push_node (const T& newNode)
{
     
     Node* newHead = new Node;
     newHead -> item = newNode;
     head.push_back(newHead);
          
}
template <class T> void Tree<T>::print()
{
       
      for (vector<Node*>::iterator iter = head.begin(); iter != head.end(); iter++)
     {
        cout << (*iter)->item << endl; }
 
}
Если это поможет, то вот ещё такая ошибка есть в строке определения итератора:
C:\CPP\Employee\Tree.cpp dependent-name ` std::vector<Tree<T>::Node*,std::allocator<Tree<T>::Node*> >::iterator' is parsed as a non-type, but instantiation yields a type
C:\CPP\Employee\Tree.cpp say `typename std::vector<Tree<T>::Node*,std::allocator<Tree<T>::Node*> >::iterator' if a type is meant
0
dimcoder
Полярный
467 / 440 / 68
Регистрация: 11.09.2011
Сообщений: 1,142
23.08.2015, 07:27 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Demion84,
C++
1
for (typename vector<Node*>::iterator iter = head.begin(); iter != head.end(); iter++)
прост с++ не уверен что iterator - это тип. А вдруг это всего лишь элемент класса vector<>? Нужно уточнять...
1
Demion84
0 / 0 / 0
Регистрация: 13.02.2013
Сообщений: 9
23.08.2015, 08:18  [ТС] #9
Спасибо! заработало! Всё гениальное просто
0
23.08.2015, 08:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2015, 08:18
Привет! Вот еще темы с ответами:

Вывод букв с помощью указателей (требуется помощь) - C++
Есть программа которая считывает слова из файла input.txt до тех пор пока они не закончатся. Я хочу в массив address помещать указатель на...

Вывод массива на экран функцией с использованием указателей - C++
Привет, при написании функции возникла проблема: в помеченной комментарием строке выдало ошибку( Ошибка C2228 выражение слева от &quot;.size&quot;...

Вывод контейнера указателей на экземпляры абстрактного класса - C++
Добрый день. Задача требует описать абстрактный класс и несколько наследников этого класса. Затем, описать контейнер (list)...

Как сделать вывод массива указателей char на экран? - C++
Доброго времени суток. Делал наброски на телефонный справочник с несколькими телефонными книгами внутри. При написании пользуюсь тем,...


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

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

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