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

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

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

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

12.08.2011, 10:15. Просмотров 3497. Ответов 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: для использования класса шаблон требуется список аргументов шаблон


Подскажите, пожалуйста, в чем дело?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.08.2011, 10:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Использование указателя на объект шаблонного класса в шаблонном классе. (C++):

Создать объект шаблонного класса в другом классе - C++
Как создать объект шаблонного класса в другом классе и вызвать через этот объект функцию? class Products { //int meat, fruit,...

Как корректно передать в метод шаблонного класса объект шаблонного класса в качестве параметра? - C++
header.h template &lt;class T&gt; class MyVector { public: void swap(MyVector&lt;T&gt;Vector); } template &lt;class T&gt; void...

Определение класса в шаблонном классе - C++
Помогите разобраться с тем, как синтаксически правильно давать определения методов подкласса шаблонного класса и методов шаблонного класса,...

Друзья шаблонного класса. Использование вложенной в класс структуры - C++
Всем привет! Изучаю книгу &quot;Прата С. - Язык программирования С++. Лекции и упражнения&quot;. Разобрал тему шаблоны классов и в заданиях для...

Удаление указателя на объект класса - C++
Что-то ни как не могу разобраться, где у меня ошибка?! Ниже приведен фрагмент кода: //... shapes *ptr=0; //ptr - указатель базового...

Указатель на объект из указателя на член класса - C++
Что как-то сей вопрос ставит меня в тупик. class A { int i; } obj; int main()

26
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,018
14.08.2011, 00:31 #16
Цитата Сообщение от gretham Посмотреть сообщение
И вот еще, я правильно понял, что "Только виртуальные функции ведь тоже не смогут быть шаблонными" это значит что я не могу определить в классе A_Base метод, который вернет значение типа параметра шаблона?
Ну я имел в виду, что параметры и возвращаемые значения виртуальных функций не могут иметь тип параметра шаблона, так как это будет перегрузка.

Цитата Сообщение от gretham Посмотреть сообщение
И это приведет к тому, что все методы класса A не объявленные в классе A_Base я не смогу использовать в B, так?
Ага. А как можно использовать в B какие-либо функции из A, если неизвестно, есть ли там такие функции и какого типа аргументы они принимают?

Цитата Сообщение от gretham Посмотреть сообщение
Если так, то вряд ли мне это подойдет.
Нет ли еще какого способа "держать там указатели на A с произвольным параметром"?
Другого хорошего способа я не знаю. Есть ещё указатель void*, но чтобы использовать объект по такому указателю надо будет его явно приводить к указателю на конкретный тип.
0
gretham
19 / 19 / 1
Регистрация: 12.08.2011
Сообщений: 59
14.08.2011, 00:45  [ТС] #17
Ладно, наверное придется обойтись без произвольного типа)

А так хотелось)))))))))))))))))
0
CyBOSSeR
Эксперт С++
2304 / 1674 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
14.08.2011, 00:47 #18
gretham, как Вы собираетесь с этим параметром произвольного типа работать?
0
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,018
14.08.2011, 00:48 #19
Цитата Сообщение от gretham Посмотреть сообщение
И это приведет к тому, что все методы класса A не объявленные в классе A_Base я не смогу использовать в B, так?
Собственно указатель на A_Base всегда можно попытаться привести к конкретному классу-наследнику, тем более что можно в рантайме проверять корректность такого приведения.
Возможно если будет пример, как надо использовать невесть какую функцию из невесть какого класса, то может какая идея и родиться.
0
gretham
19 / 19 / 1
Регистрация: 12.08.2011
Сообщений: 59
14.08.2011, 01:07  [ТС] #20
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
gretham, как Вы собираетесь с этим параметром произвольного типа работать?
То есть какие методы?

Или просто для чего он мне?
0
CyBOSSeR
Эксперт С++
2304 / 1674 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
14.08.2011, 01:09 #21
gretham, ну, лежит у Вас где-то поле неизвестного вам заранее типа, хранить не проблема, но работать-то с ним как собираетесь?
0
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(данные) - изменение данных, связанных с ребром.

Здесь два указателя на вершины лежат в ребре, и ребра и вершины шаблонные (обязательное условие) и данные могут быть разных типов.
Вот как - то так))
0
CyBOSSeR
Эксперт С++
2304 / 1674 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
14.08.2011, 01:45 #23
gretham, а с чего вы взяли что у вершин и ребер данные будут разных типов?
0
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);
}

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

Мне тоже

Могу потом результаты тестирования выложить, если интересно)
0
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,018
14.08.2011, 02:14 #27
Ну мне просто интересно, где будет храниться большое количество разнотипных рёбер и вершин, и как с этими рёбрами и вершинами работать.
0
14.08.2011, 02:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2011, 02:14
Привет! Вот еще темы с ответами:

У меня класс B в классе A, а в классе B рекурсивная функция переопределения оператора "()", как её вызвать, не создавая явно объект класса B? - C++
#include &lt;windows.h&gt; #include &lt;iostream&gt; using namespace std; //Вот главный класс class A{ public: A (){}; class...

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

Передача указателя в класс на объект другого класса - C++
Не могу передать ссылку на объект класса в другой класс main.cpp #include &lt;iostream&gt; #include &quot;test\class_a.h&quot; #include...

Объект класса в классе - C++
Товарищи, помогите уже не знаю что делать!! Есть класс Point и класс Pixel, есть методы и там и там. В классе Pixel создаю объект типа...


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

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Опции темы

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