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

Дружественный шаблонный класс - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Неправильный вывод при работе с файлом http://www.cyberforum.ru/cpp-beginners/thread936997.html
Возникла непонятка при выводе на экран текстового файла. У меня имеется файл с последовательностью чисел. например 1 2 3 4 5 фрагмент кода для вывода ifstream a; a.open(adress); while(a) {int info; a>>info;
C++ Что требуется ? Здравствуйте. Помогите пожалуйста разобрать, что от меня требуется в двух приведённых ниже этих задачах. 1) Выбрать из совокупности L плоских многоугольников с числом вершин, не большим K, правильные многоугольники, упорядочить их по возрастанию площадей. В случае отсутствия совокупности таких многоугольников выдать сообщение. 2)Тара имеет вид параллелепипеда с рёбрами a,b,c, может быть... http://www.cyberforum.ru/cpp-beginners/thread936971.html
C++ Перевод из сантиметры в метры
Задача такая: нужно перевести из сантиметра в метры, и результат записать в виде "n метров, n сантиметров". Не могу скомпилировать, пишет ошибку LNK2019 и LNK1120. Вот сам код: #include <iostream> using std::cout; using std::cin; int sm_to_m(int); int sm, m, smmod; const int M = 100; // постоянная, количество см в м
C++ getline, string, запись в файл, русский язык
#include <iostream> using std::ios; using std::cin; using std::cout; using std::endl; #include <string> using std::string; #include <fstream>
C++ Найти количество заштрихованых квадратов http://www.cyberforum.ru/cpp-beginners/thread936921.html
Помогите решить задачку пожалуйста. Программа должна вывести количество заштрихованых квадратов (5) если квадраты прилегают друг к другу это щитается как 1.
C++ Нулевые значения массива Для чего инициализировать массив нулевыми значениями? подробнее

Показать сообщение отдельно
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
12.08.2013, 18:08     Дружественный шаблонный класс
Мимино, вот весь заголовочный файл:

Кликните здесь для просмотра всего текста
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
#ifndef LISTND_H
#define LISTND_H
 
#include <iostream>
#include <assert.h>
 
using namespace std;
 
template <class NODETYPE>
class List;
 
template <class NODETYPE>
class ListNode
{
    friend class List<NODETYPE>;
 
public:
    ListNode(const NODETYPE &);
    NODETYPE getData() const;
 
private:
    NODETYPE data;
    ListNode<NODETYPE> *nextPtr;
};
 
template <class NODETYPE>
class List
{
public:
    List();
    ~List();
    void insertAtFront(const NODETYPE &);
    void insertAtBack(const NODETYPE &);
    int removeFromFront(NODETYPE &);
    int removeFromBack(NODETYPE &);
    int isEmpty() const;
    void print() const;
 
private:
    ListNode<NODETYPE> *firstPtr;
    ListNode<NODETYPE> *lastPtr;
    ListNode<NODETYPE> *getNewNode(const NODETYPE &);
};
 
 
template <class NODETYPE>
ListNode<NODETYPE>::ListNode(const NODETYPE &info)
{
    data = info;
    nextPtr = 0;
}
 
template <class NODETYPE>
NODETYPE ListNode<NODETYPE>::getData() const { return data; }
 
template <class NODETYPE>
List<NODETYPE>::List() { firstPtr = lastPtr = 0; }
 
template <class NODETYPE>
List<NODETYPE>::~List()
{
    if (!isEmpty())
    {
        cout << "Удаление узлов... " << endl;
        ListNode<NODETYPE> *currentPtr = firstPtr, *tempPtr;
 
        while (currentPtr != 0)
        {
            tempPtr = currentPtr;
            cout << tempPtr->data << endl;
            currentPtr = currentPtr->nextPtr;
            delete tempPtr;
        }
    }
 
    cout << "Все узлы удалены" << endl << endl;
}
 
template <class NODETYPE>
void List<NODETYPE>::insertAtFront(const NODETYPE &value)
{
    ListNode<NODETYPE> *newPtr = getNewNode(value);
 
    if (isEmpty())
        firstPtr = lastPtr = newPtr;
    else
    {
        newPtr->nextPtr = firstPtr;
        firstPtr = newPtr;
    }
}
 
template <class NODETYPE>
void List<NODETYPE>::insertAtBack(const NODETYPE &value)
{
    ListNode<NODETYPE> *newPtr = getNewNode(value);
 
    if (isEmpty())
        firstPtr = lastPtr = newPtr;
    else
    {
        lastPtr->nextPtr = newPtr;
        lastPtr = newPtr;
    }
}
 
template <class NODETYPE>
int List<NODETYPE>::removeFromFront(NODETYPE &value)
{
    if (isEmpty())
        return 0;
    else
    {   
        ListNode<NODETYPE> *tmpPtr = firstPtr;
        if (firstPtr == lastPtr)
            firstPtr = lastPtr = 0;
        else
            firstPtr = firstPtr->nextPtr;
        value = tmpPtr->data;
        delete tmpPtr;
        return 1;
    }
 
}
 
template <class NODETYPE>
int List<NODETYPE>::removeFromBack(NODETYPE &value)
{
    if (isEmpty())
        return 0;
    else
    {   
        ListNode<NODETYPE> *tmpPtr = lastPtr;
        if (firstPtr == lastPtr)
            firstPtr = lastPtr = 0;
        else
        {
            ListNode<NODETYPE> *currentPtr = firstPtr;
 
            while (currentPtr->nextPtr != lastPtr)
                currentPtr = currentPtr->nextPtr;
 
            lastPtr = currentPtr;
            currentPtr->nextPtr = 0;
        }
 
        value = tmpPtr->data;
        delete tmpPtr;
        return 1;
    }
}
 
template <class NODETYPE>
int List<NODETYPE>::isEmpty() const { return firstPtr == 0; }
 
template <class NODETYPE>
ListNode<NODETYPE> *List<NODETYPE>::getNewNode(const NODETYPE &value)
{
    ListNode<NODETYPE> *ptr = new ListNode<NODETYPE>(value);
    assert(ptr != 0);
    return ptr;
}
 
template <class NODETYPE>
void List<NODETYPE>::print() const
{
    if (isEmpty())
    {
        cout << "Список пуст" << endl << endl;
        return;
    }
 
    ListNode<NODETYPE> *currentPtr = firstPtr;
    cout << "Список состоит из: ";
 
    while (currentPtr != 0)
    {
        cout << currentPtr->data << ' ';
        currentPtr = currentPtr->nextPtr;
    }
 
    cout << endl << endl;
}
 
#endif


Понадобилось еще предварительное объявление шаблонного класса List. Можно было еще объявить дружественный класс с другим именем параметра:

C++
1
2
template <class T>
friend class List;
 
Текущее время: 10:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru