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

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

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

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

08.01.2011, 19:11. Просмотров 1549. Ответов 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 и последней версии - нет. Как-то неправильно объявляю друга? А как правильно?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2011, 19:11     Friend - класс шаблон
Посмотрите здесь:

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

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
08.01.2011, 20:38     Friend - класс шаблон #2
AlexRyzhenko, Определитть класс Queue заранее. Неполное объявление класса.
AlexRyzhenko
0 / 0 / 0
Регистрация: 29.07.2009
Сообщений: 119
08.01.2011, 22:52  [ТС]     Friend - класс шаблон #3
ForEveR, можно подробней?
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
09.01.2011, 09:55     Friend - класс шаблон #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
{
     ...
};
AlexRyzhenko
0 / 0 / 0
Регистрация: 29.07.2009
Сообщений: 119
09.01.2011, 17:25  [ТС]     Friend - класс шаблон #5
ForEveR, так как Вы предлогаете не компилится. Компилится только если написать так
C++
1
friend class Queue <NODETYPE>;
Кстати, в примере у Дейтелов так и есть. Ну, в принципе это ладно, если всё написано правильно и в vs компилится, хотя нужно разобраться почему.
Что касается того, почему дружественная - делаю как в примере, хотя, наверно, стоит элемент сделать частью... Спасибо.

Добавлено через 1 час 19 минут
Теперь я не пойму как обращаться к классу QueueNode. Если, например, метод класса Queue возвращает указатель на объект класса QueueNode, то что писать в объявлении и в определении метода?
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
09.01.2011, 17:26     Friend - класс шаблон #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;
};
AlexRyzhenko
0 / 0 / 0
Регистрация: 29.07.2009
Сообщений: 119
09.01.2011, 18:17  [ТС]     Friend - класс шаблон #7
silent_1991, я не понял чем моя отличается от Вашей, кроме того, что один элемент у Вас не как класс, а как структура.
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
09.01.2011, 18:39     Friend - класс шаблон #8
AlexRyzhenko, ну, вашу очередь я не видел. Но у меня нет никаких друзей. Почему узел - это друг очереди? Это как вагон - друг поезда. Т.е. абсурдно. Друг нужен, чтобы один класс (в случае классов-друзей) имел доступ к закрытым элементам своего друга. Только вот зачем узлу иметь доступ к элементам обёртки? Узлу надо выполнять свою основную функцию - хранить данные и помнить о своём соседе (или соседях). У него даже никаких методов быть не должно - ему выполнять нечего.

Добавлено через 1 минуту
А, всё, понял. У вас наоборот, обёртка - друг узла. Да, тогда разницы нет, у меня просто все данные изначально открыты, поскольку узел - структура.
AlexRyzhenko
0 / 0 / 0
Регистрация: 29.07.2009
Сообщений: 119
09.01.2011, 18:44  [ТС]     Friend - класс шаблон #9
Я ввёл класс QueueNode в класс Queue. Если отказаться от функции возвращающей указатель, то в vs нормально, а MinGW пишет:
template.h:4:14: error: declaration of 'class NODETYPE'
template.h:2:11: error: shadows template parm 'class NODETYPE'
Посмотрите, пожалуйста, исходники.
Вложения
Тип файла: rar template.rar (2.3 Кб, 15 просмотров)
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
09.01.2011, 19:21     Friend - класс шаблон #10
У вас типы в шаблонах повторяются. Во вложенном классе опишите тип как _NODETYPE, ну или вообще другим именем.
AlexRyzhenko
0 / 0 / 0
Регистрация: 29.07.2009
Сообщений: 119
09.01.2011, 19:30  [ТС]     Friend - класс шаблон #11
silent_1991, да так нормально. Спасибо. Мне ещё интересно, как определить конструктор за пределами класса? В чём там фишка?
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
09.01.2011, 19:35     Friend - класс шаблон #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)
{
}
AlexRyzhenko
0 / 0 / 0
Регистрация: 29.07.2009
Сообщений: 119
09.01.2011, 20:41  [ТС]     Friend - класс шаблон #13
Нет. Конструктор класса QueueNode.
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
09.01.2011, 20:46     Friend - класс шаблон #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)
{
}
AlexRyzhenko
0 / 0 / 0
Регистрация: 29.07.2009
Сообщений: 119
09.01.2011, 23:04  [ТС]     Friend - класс шаблон #15
Что я запутался с параметрами. Конструктор определить не получается. В примере легче. Вот что я пищу:
C++
1
2
3
template <class NOPDETYPE> Queue<NODETYPE>::QueueNode<_NODETYPE>::QueueNode(const _NODETYPE info)
{
}
И vs подчёркивает всю внутренность и ощибки пишет
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
09.01.2011, 23:21     Friend - класс шаблон #16
Так, секунду... А вам обязательно класс QueueNode делать шаблонным? Не правильнее ли так:

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< typrname T >
class Queue
{
public:
    // Методы Queue
 
private:
    class QueueNode
    {
    public:
        QueueNode(const T &);
 
        // Методы QueueNod
 
    private:
        T _data;
    };
};
 
template< typename T >
Queue< T >::QueueNode::QueueNode(const T &data):
_data(data)
{
}
Т.е. у нас же узел очереди будет содержать данные того типа, который определяется при создании самой очереди. Пользователь-то про QueueNode ничего не знает. И тип ему давать не надо, надо тип только для Queue определить, а дальше и QueueNode может этот тип использовать.
AlexRyzhenko
0 / 0 / 0
Регистрация: 29.07.2009
Сообщений: 119
09.01.2011, 23:37  [ТС]     Friend - класс шаблон #17
Нет так тоже самое. Обычно знаете в vs пишешь :: или точку и появляется список и теперь там класса вообще нет.
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
09.01.2011, 23:39     Friend - класс шаблон #18
Вот тот вариант, что я вам привёл, написан в MSVS2010 - всё работает.

Добавлено через 30 секунд
Мда... Там, в начале - typename естественно))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2011, 00:18     Friend - класс шаблон
Еще ссылки по теме:

Из класса в класс-шаблон - C++
Здравствуйте. Есть класс: class Bit_Indic { char indic; public: Bit_Indic (char _one, char _two, char _three, char...

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

Вернуть класс-шаблон - C++
Доброго времени суток. Переделываю класс-коллекцию под шаблон, возникла вот какая трудность: компилятор (C++ Builder) ругается на вот такой...

Класс шаблон и методы класса - C++
Есть такой класс-список прямо из учебника павловской: template &lt;class Data&gt; class List{ class Node{ Data d; Node *next; ...

Создать шаблон класс Queue - C++
Создать шаблон класс Queue. Добавить след. методы: 1. добавление узла после заданного элемента 2. удаление последнего узла 3....


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

Или воспользуйтесь поиском по форуму:
AlexRyzhenko
0 / 0 / 0
Регистрация: 29.07.2009
Сообщений: 119
10.01.2011, 00:18  [ТС]     Friend - класс шаблон #19
Работает, если определять конструктор в том же файле. А если в другом.....

Добавлено через 3 минуты
Нет это только у vs такие заскоки. MinGW норм. Наверно просто спать пора)

Добавлено через 9 минут
О, все!!! Работает!!! Всем СПАСИБО!
Yandex
Объявления
10.01.2011, 00:18     Friend - класс шаблон
Ответ Создать тему
Опции темы

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