15.07.2015, 00:15. Просмотров 272. Ответов 7
Описал класс и его наследника в заголовочном файле; самые громоздкие определения функций вынес в отдельные файлы, однако при компиляции/сборке эти определения не видно из файла с "main".
Здесь указан код для студии, однако при компиляции из консоли с помощью GCC - результата тоже ноль.
Студия ругается на "неразрешенный внешний символ" (подключение всех pdb-файлов, какие нашел в проекте, не помогло).
GCC прямо говорит, что не видит некоторые необходимые определения.
Все файлы абсолютно точно лежат в одной папке и подключены к проекту.
Предоставлю только один файл с определениями, потому что они абсолютно идентичны по своей структуре.
Заголовочный файл:
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
| #pragma once //замена на стандартный способ через "#ifndef" ничего не дает
template<typename T>
class singleLinkedList
{
protected:
struct list_elem
{
T el;
list_elem *next;
};
list_elem *top;
unsigned long size;
void next_elem() { top = top->next; };
public:
singleLinkedList() { top = NULL; size = 0; };
bool is_empty() const { return top == NULL; };
unsigned long list_size() { return size; };
void show(); //выводим список
virtual void add_elem(const T &elem); //добавляем элемент
virtual void del_elem(); //удаляем элемент
virtual void reverse(); //разворачиваем список
virtual ~singleLinkedList();
};
template<typename T>
class doubleLinkedList : public singleLinkedList<T>
{
private:
struct list_elem
{
T el;
list_elem *next;
list_elem *prev;
};
list_elem *top;
//unsigned long size;
void next_elem() { top = top->next; };
void prev_elem() { top = top->prev; };
public:
doubleLinkedList() { top = NULL; size = 0; };
bool is_empty() const { return top == NULL; };
//unsigned long list_size() { return size; };
void show() { singleLinkedList<T>::show(); };
virtual void add_elem(const T &elem); //добавляем элемент
virtual void del_elem(); //удаляем элемент
virtual void reverse(); //разворачиваем список
virtual ~doubleLinkedList() { singleLinkedList<T>::~singleLinkedList(); };
}; |
|
Файл с определениями:
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
| #include "stdafx.h"
#include <iostream>
#include "myList.h"
template<typename T>
void singleLinkedList<T>::add_elem(const T &elem)
{
list_elem *new_el = new list_elem;
new_el->el = elem;
new_el->next = top;
top = new_el;
};
template<typename T>
void singleLinkedList<T>::show() //выводим список
{
list_elem *start = top;
std::cout << "[";
while (top != NULL)
{
std::cout << top->el << ", ";
next_elem();
}
std::cout << "\b\b]";
top = start;
};
template<typename T>
void singleLinkedList<T>::reverse()//разворот списка, колдуем с указателями
{
list_elem *cur_elem = top;
list_elem *next_elem = top->next;
list_elem *prev_elem = NULL;
cur_elem->next = prev_elem;
while (next_elem != NULL)
{
prev_elem = cur_elem;
cur_elem = next_elem;
next_elem = cur_elem->next;
cur_elem->next = prev_elem;
}
top = cur_elem;
};
template<typename T>
void singleLinkedList<T>::del_elem()
{
switch (size)
{
case 0:
{
std::cout << "List is empty, imposable to delete something!";
break;
}
case 1:
{
delete top;
top = NULL;
size--;
break;
}
default:
{
list_elem *start = top->next;
delete top;
top = start;
size--;
break;
}
}
};
template<typename T>
singleLinkedList<T>::~singleLinkedList()
{
list_elem *cur_el = top;
while (top != NULL)
{
cur_el = top->next;
delete top;
top = cur_el;
std::cout << "deleted\n";
}
}; |
|
Файл с функцией "main":
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
| #include "stdafx.h"
#include <iostream>
#include "myList.h"
int _tmain(int argc, _TCHAR* argv[])
{
singleLinkedList <int> l;
if (l.is_empty()) for (int i = 1; i<5; i++) l.add_elem(i);
l.show();
std::cout << "\n";
l.reverse();
l.show();
std::cout << "\n";
l.del_elem();
l.show();
l.~singleLinkedList();
doubleLinkedList <int> l1;
if (l1.is_empty()) for (int i = 1; i<5; i++) l1.add_elem(i);
l1.show();
std::cout << "\n";
l1.reverse();
l1.show();
std::cout << "\n";
l1.del_elem();
l1.show();
l1.~doubleLinkedList();
int n;
std::cin >> n;
return 0;
} |
|