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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
AlexRyzhenko
0 / 0 / 0
Регистрация: 29.07.2009
Сообщений: 119
#1

Friend - класс шаблон - C++

08.01.2011, 19:11. Просмотров 1570. Ответов 18
Метки нет (Все метки)

Подскажите, пожалуйста, почему Visual C++ 2010 Express нормально компилирует код
C++
1
2
3
4
5
6
7
8
9
template <class NODETYPE> class QueueNode
{
       ...
       template <class NODETYPE> friend class Queue;
};
template <class NODETYPE> class Queue
{
     ...
}
а MinGw версии 5,1,6 и последней версии - нет. Как-то неправильно объявляю друга? А как правильно?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2011, 19:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Friend - класс шаблон (C++):

класс Friend - C++
Подскажите в каких случаях лучше использовать класс friend? Известно что класс friend нарушает принцип инкапсуляции, так почему же мы его...

Класс friend - C++
Проблемка с доступом через дружественный класс: class Game { friend Player; //тут объявлен класс-друг ...

Перегрузка операторов, friend или нет friend? - C++
Всем здравствуйте. Есть такой вопрос: при перегрузке операторов в классе(пусть будут + и = (вообще неважно, за исключением потока)) как и...

Ошибка при компиляции:"C2955 "Tree": для использования класс шаблон требуется список аргументов шаблон" - C++
Есть класс бинарного дерева, в нем структура. Класс - Tree, структура - list(листик, а не список). При компиляции выдает...

Friend для friend - C++
всем доброго времени суток, покажу проблему на примере: Class B; class A{ int F; friend B; public: A(){F=0;}; };

Класс-шаблон - C++
Создать класс-шаблон, содержащий поля для хранения одномерного массива и количества элементов в массиве. Описать методы для инициализации и...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
08.01.2011, 20:38 #2
AlexRyzhenko, Определитть класс Queue заранее. Неполное объявление класса.
0
AlexRyzhenko
0 / 0 / 0
Регистрация: 29.07.2009
Сообщений: 119
08.01.2011, 22:52  [ТС] #3
ForEveR, можно подробней?
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
09.01.2011, 09:55 #4
Но вообще как-то не логично. Зачем узел очереди - друг очереди?) Разве это не ее составная часть?)

C++
1
2
3
4
5
6
7
8
9
10
11
template <class NODETYPE> class Queue;
 
template <class NODETYPE> class QueueNode
{
       ...
       template <class NODETYPE> friend class Queue;
};
template <class NODETYPE> class Queue
{
     ...
};
0
AlexRyzhenko
0 / 0 / 0
Регистрация: 29.07.2009
Сообщений: 119
09.01.2011, 17:25  [ТС] #5
ForEveR, так как Вы предлогаете не компилится. Компилится только если написать так
C++
1
friend class Queue <NODETYPE>;
Кстати, в примере у Дейтелов так и есть. Ну, в принципе это ладно, если всё написано правильно и в vs компилится, хотя нужно разобраться почему.
Что касается того, почему дружественная - делаю как в примере, хотя, наверно, стоит элемент сделать частью... Спасибо.

Добавлено через 1 час 19 минут
Теперь я не пойму как обращаться к классу QueueNode. Если, например, метод класса Queue возвращает указатель на объект класса QueueNode, то что писать в объявлении и в определении метода?
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
09.01.2011, 17:26 #6
Поддерживаю ForEveRа, например, такая структура очереди была бы логичнее:

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
template< typename T >
struct Node
{
    T _data;
    Node *_next;
 
    Node(T data): _data(data), _next(0) { }
};
 
template< typename T >
class Queue
{
public:
    Queue(): _first(0), _last(0) { }
    
    bool is_empty() { return _first == 0; }
 
    void push(T);
    T pop() const;
 
private:
    Node *_first;
    Node *_last;
};
0
AlexRyzhenko
0 / 0 / 0
Регистрация: 29.07.2009
Сообщений: 119
09.01.2011, 18:17  [ТС] #7
silent_1991, я не понял чем моя отличается от Вашей, кроме того, что один элемент у Вас не как класс, а как структура.
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
09.01.2011, 18:39 #8
AlexRyzhenko, ну, вашу очередь я не видел. Но у меня нет никаких друзей. Почему узел - это друг очереди? Это как вагон - друг поезда. Т.е. абсурдно. Друг нужен, чтобы один класс (в случае классов-друзей) имел доступ к закрытым элементам своего друга. Только вот зачем узлу иметь доступ к элементам обёртки? Узлу надо выполнять свою основную функцию - хранить данные и помнить о своём соседе (или соседях). У него даже никаких методов быть не должно - ему выполнять нечего.

Добавлено через 1 минуту
А, всё, понял. У вас наоборот, обёртка - друг узла. Да, тогда разницы нет, у меня просто все данные изначально открыты, поскольку узел - структура.
1
AlexRyzhenko
0 / 0 / 0
Регистрация: 29.07.2009
Сообщений: 119
09.01.2011, 18:44  [ТС] #9
Я ввёл класс QueueNode в класс Queue. Если отказаться от функции возвращающей указатель, то в vs нормально, а MinGW пишет:
template.h:4:14: error: declaration of 'class NODETYPE'
template.h:2:11: error: shadows template parm 'class NODETYPE'
Посмотрите, пожалуйста, исходники.
0
Вложения
Тип файла: rar template.rar (2.3 Кб, 15 просмотров)
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
09.01.2011, 19:21 #10
У вас типы в шаблонах повторяются. Во вложенном классе опишите тип как _NODETYPE, ну или вообще другим именем.
0
AlexRyzhenko
0 / 0 / 0
Регистрация: 29.07.2009
Сообщений: 119
09.01.2011, 19:30  [ТС] #11
silent_1991, да так нормально. Спасибо. Мне ещё интересно, как определить конструктор за пределами класса? В чём там фишка?
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
09.01.2011, 19:35 #12
Как и любую другую функцию - через оператор разрешения области действия ::

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class foo
{
public:
    foo(int = 0);
 
private:
    int _a;
};
 
foo::foo(int a):
_a(a)
{
}
0
AlexRyzhenko
0 / 0 / 0
Регистрация: 29.07.2009
Сообщений: 119
09.01.2011, 20:41  [ТС] #13
Нет. Конструктор класса QueueNode.
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
09.01.2011, 20:46 #14
AlexRyzhenko, а у него что, какие-то особенности есть, которых в других конструкторах нету?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class foo
{
    class bar
    {
    public:
        bar(int = 0);
 
    private:
        int _b;
    };
};
 
foo::bar::bar(int b):
_b(b)
{
}
0
AlexRyzhenko
0 / 0 / 0
Регистрация: 29.07.2009
Сообщений: 119
09.01.2011, 23:04  [ТС] #15
Что я запутался с параметрами. Конструктор определить не получается. В примере легче. Вот что я пищу:
C++
1
2
3
template <class NOPDETYPE> Queue<NODETYPE>::QueueNode<_NODETYPE>::QueueNode(const _NODETYPE info)
{
}
И vs подчёркивает всю внутренность и ощибки пишет
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2011, 23:04
Привет! Вот еще темы с ответами:

Класс-Шаблон - C++
В файле input1.txt - находятся числа в 10 с\с и лексемы. Реализовать: Написать класс-шаблон: class Steck{ X *elems...

Класс-шаблон - C++
Создать класс-шаблон, содержащий поля для хранения одномерного массива и количества элементов в массиве. Описать методы для инициализации и...

класс-шаблон - C++
Создать класс-шаблон, содержащий поля для хранения одномерного массива и количества элементов в массиве. Описать методы для инициализации и...

Класс-шаблон list - C++
Хаюшки всем умным людям:) Есть такое задание: Создать класс-шаблон List для работы со списком на основе массива. Реализовать...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.01.2011, 23:04
Ответ Создать тему
Опции темы

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