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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.80
gretham
19 / 19 / 1
Регистрация: 12.08.2011
Сообщений: 59
#1

Использование указателя на объект шаблонного класса в шаблонном классе. - C++

12.08.2011, 10:15. Просмотров 3276. Ответов 26
Метки нет (Все метки)

Всем привет!
Мне нужно реализовать граф. Начал с вершин и ребер, причем и ребра и вершины - шаблонные классы, для того чтобы и ребро и вершина могли содержать разные данные.
В ребре указатели на 2 вершины.

Класс вершины:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <class T> class Vertex {
        private: 
            char* name;
            T data;
            int index;
        public: 
            Vertex();
            Vertex(char* nam, T dat, int ind);
            ~Vertex();
            char* getName(); 
            T getData(); //возвращает данные, связанные с вершиной,
            void setName(char *nam); //задает имя вершины,
            void setData(T dat); //записывает данные data в дескриптор вершины.
    };
Класс ребра:
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
template <class TT>
class Edge {
    private:
        Vertex *v1, *v2;
        int w;
    public:
        Edge(Vertex *va, Vertex *vb) {
            v1 = va;
            v2 = vb;
        }
            Edge(Vertex *va, Vertex *vb, int ww) {
            v1 = va;
            v2 = vb;
            w = ww;
           }
           Edge(Vertex *va, Vertex *vb, int ww, TT dat) {
            v1 = va;
            v2 = vb;
            w = ww;
            data = dat;
           }
           ~Edge();
        
           int getW();
           void setW(int ww);
           TT getData();
           void setData(TT dat);
};
При попытке создать ребро с двумя ребрами:
C++
1
2
3
Vertex<int> e1("parampampam", 123, 0);
Vertex<int> e2("parampampam", 123, 1);
Edge<int> rebro(&e1, &e2);
Появляется вот такая ошибка:


1>c:\users\артем\documents\visual studio 2010\projects\kp2\kp2\Vertex.cpp(6): error C2955: Vertex: для использования класса шаблон требуется список аргументов шаблон


Подскажите, пожалуйста, в чем дело?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.08.2011, 10:15     Использование указателя на объект шаблонного класса в шаблонном классе.
Посмотрите здесь:
Создать объект шаблонного класса в другом классе C++
Определение класса в шаблонном классе C++
Друзья шаблонного класса. Использование вложенной в класс структуры C++
C++ Удаление указателя на объект класса
C++ Указатель на объект из указателя на член класса
У меня класс B в классе A, а в классе B рекурсивная функция переопределения оператора "()", как её вызвать, не создавая явно объект класса B? C++
C++ Предусмотреть использование шаблонного класса для работы с различными типами данных
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
14.08.2011, 01:09     Использование указателя на объект шаблонного класса в шаблонном классе. #21
gretham, ну, лежит у Вас где-то поле неизвестного вам заранее типа, хранить не проблема, но работать-то с ним как собираетесь?
gretham
19 / 19 / 1
Регистрация: 12.08.2011
Сообщений: 59
14.08.2011, 01:35  [ТС]     Использование указателя на объект шаблонного класса в шаблонном классе. #22
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
gretham, ну, лежит у Вас где-то поле неизвестного вам заранее типа, хранить не проблема, но работать-то с ним как собираетесь?
Как минимум мне нужно будет менять это поле (т. е. значение) и не факт, что оно будет того же типа (это в идеале конечно).

Возможно я не так выразился, поэтому прям приведу кусок из задания)

АТД «Дескриптор вершины графа»
Дескриптор вершины содержит поля:
name – имя вершины,
data – данные, связанные с вершиной,
index – индекс вершины в структуре графа или -1,
Интерфейс АТД «Дескриптор вершины графа» включает операции:
Конструктор ():поле name не определено, поле data не определено,
Конструктор (name, data): name - имя вершины, data - данные, связанные с вершиной,
GetName( ) - возвращает имя вершины,
GetData( ) - возвращает данные, связанные с вершиной,
SetName(name ) – задает имя вершины,
SetData(data) – записывает данные data в дескриптор вершины.

АТД «Дескриптор ребра графа»
Дескриптор ребра содержит поля:
v1 - дескриптор вершины, из которой исходит ребро,
v2 - дескриптор вершины, в которую входит ребро,
w - вес ребра,
data - данные, связанные с ребром,
Интерфейс АТД «Дескриптор ребра графа» включает операции:
Конструктор (v1, v2): v1 - дескриптор вершины, из которой исходит ребро, v2 - дескриптор вершины, в которую входит ребро,
Конструктор (v1, v2, w ): v1 - дескриптор вершины, из которой исходит ребро, v2 - дескриптор вершины, в которую входит ребро, w - вес ребра,
Конструктор (v1, v2, w, data): v1 - дескриптор вершины, из которой исходит ребро, v2 - дескриптор вершины, в которую входит ребро, w - вес ребра, data - данные, связанные с ребром
v1( ) - возвращает дескриптор вершины, из которой исходит ребро,
v2( ) - возвращает дескриптор вершины, в которую входит ребро,
from (дескриптор вершины v) - возвращает признак исхода ребра из заданной вершины v,
other(дескриптор вершины v) - возвращает дескриптор вершины, связанной с вершиной v данным ребром,
GetW ( ) - возвращает вес ребра,
SetW (вес ребра) - изменение веса ребра,
GetData( ) - возвращает данные, связанные с ребром,
SetData(данные) - изменение данных, связанных с ребром.

Здесь два указателя на вершины лежат в ребре, и ребра и вершины шаблонные (обязательное условие) и данные могут быть разных типов.
Вот как - то так))
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
14.08.2011, 01:45     Использование указателя на объект шаблонного класса в шаблонном классе. #23
gretham, а с чего вы взяли что у вершин и ребер данные будут разных типов?
gretham
19 / 19 / 1
Регистрация: 12.08.2011
Сообщений: 59
14.08.2011, 02:05  [ТС]     Использование указателя на объект шаблонного класса в шаблонном классе. #24
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
gretham, а с чего вы взяли что у вершин и ребер данные будут разных типов?
Если я слеплю из всего этого граф в итоге, то получится, что все вершины и ребра будут содержать только данные одного и того же типа.

Какой же смысл реализовывать структуру хранения данных, в которой может быть только один тип данных?

Блин, придумал! (вернеемодифицировал то, что друг посоветовал)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template <class Data> class Vertex {
  private:
    Data data;
  public:
    Vertex(){}
};
template <class VertexA, class VertexB, class Data> class Edge
{
  private:
    VertexA *v1;
    VertexB *v2;
    Data data;
  public:
    Edge(VertexA *a, VertexB* b) : v1(a), v2(b) {}
};
 
int main() {
  Vertex<int> a;
  Vertex<char*> b;
  Edge<Vertex<int>, Vertex<char*>, int> L(&a, &b);
}

Писал по ходу, так что возможны ошибки.
grizlik78
Эксперт С++
1904 / 1436 / 109
Регистрация: 29.05.2011
Сообщений: 2,990
14.08.2011, 02:10     Использование указателя на объект шаблонного класса в шаблонном классе. #25
gretham, интересно будет посмотреть, как из этого можно слепить граф с десятком-другим рёбер
gretham
19 / 19 / 1
Регистрация: 12.08.2011
Сообщений: 59
14.08.2011, 02:12  [ТС]     Использование указателя на объект шаблонного класса в шаблонном классе. #26
Цитата Сообщение от grizlik78 Посмотреть сообщение
gretham, интересно будет посмотреть, как из этого можно слепить граф с десятком-другим рёбер

Мне тоже

Могу потом результаты тестирования выложить, если интересно)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2011, 02:14     Использование указателя на объект шаблонного класса в шаблонном классе.
Еще ссылки по теме:
C++ Передача указателя в класс на объект другого класса
Объект класса в классе C++
C++ Зачем для указателя на объект класса создается отдельный класс
C++ Объект класса в другом классе
C++ Статические функции: добавления указателя (типа AbstractClass) на объект данного класса

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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт С++
1904 / 1436 / 109
Регистрация: 29.05.2011
Сообщений: 2,990
14.08.2011, 02:14     Использование указателя на объект шаблонного класса в шаблонном классе. #27
Ну мне просто интересно, где будет храниться большое количество разнотипных рёбер и вершин, и как с этими рёбрами и вершинами работать.
Yandex
Объявления
14.08.2011, 02:14     Использование указателя на объект шаблонного класса в шаблонном классе.
Ответ Создать тему
Опции темы

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