Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/65: Рейтинг темы: голосов - 65, средняя оценка - 4.63
 Аватар для gretham
19 / 19 / 1
Регистрация: 12.08.2011
Сообщений: 59

Проблема наследования от шаблонного класса.

31.08.2011, 02:13. Показов 13123. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем!

У меня есть шаблонный класс, и наследуемый от него шаблонный класс.

Базовый:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "Lgraph.h"
#include "Mgraph.h"
 
template <class Edge>
class vgraph {
 
    friend class lgraph<Edge>;
    friend class mgraph<Edge>;
 
    protected:
    public:
        virtual ~vgraph() = 0;
        virtual Edge* g_insert_edge(Edge *edge) = 0;
 
};
Наследник:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <vector>
#include <list>
using namespace std; 
 
template <class Edge>
class lgraph : public vgraph<Edge> {
    protected:
        vector< list<Edge*> > vectorl;
    public:
        lgraph();
        Edge* g_insert_edge(Edge *edge);
};
 
template <class Edge> 
lgraph<Edge>::lgraph() {
 
}
При попытк выполнить код
C++
1
2
3
vgraph<Edge> *graph;
lgraph<Edge> l;
graph = &l;
возникает ошибка:
error C2143: синтаксическая ошибка: отсутствие "," перед "<"
в строке
C++
1
class lgraph : public vgraph<Edge> {
Подскажите, пожалуйста, что не так)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.08.2011, 02:13
Ответы с готовыми решениями:

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

Вызов метода у шаблонного поля, шаблонного класса
Пытаюсь разобраться с шаблонами- задача создать шаблонный класс, у которого есть шаблонное поле. и затем вызывать метод у этого поля. ...

Инициализация шаблонного класса(В конструкторе класса после двоеточия вновь имя класса)
Всем доброго времени суток! Пытаюсь разобраться как работает приведенный мной код. Конкретно, пытаюсь разобраться что происходит в...

17
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
31.08.2011, 02:28
Похоже на неправильный порядок объявления классов.
В первом файле (ну, по-крайней мере по тому куску кода, что есть) подключать "Lgraph.h" и "Mgraph.h" ни к чему. там достаточно предварительного объявления шаблонов:
C++
1
2
3
4
5
template <typename Edge>
class lgraph;
 
template <typename Edge>
class mgraph;
А вот во втором файле уже нужно подключить "Vgraph.h" (или где там базовый класс), так как базовый класс должен быть определён.
1
 Аватар для gretham
19 / 19 / 1
Регистрация: 12.08.2011
Сообщений: 59
31.08.2011, 02:33  [ТС]
Теперь появляются 4 ошибки такого вида

error LNK2028: ссылка на неразрешенную лексему (0A000010) "public: virtual class Edge<class Vertex<int,int>,int> * __clrcall lgraph<class Edge<class Vertex<int,int>,int> >::g_insert_edge(class Edge<class Vertex<int,int>,int> *)" (?g_insert_edge@?$lgraph@V?$Edge@V?$Vert ex@HH@@H@@@@$$FUAMPAV?$Edge@V?$Vertex@HH @@H@@PAV2@@Z) в функции "void __clrcall `dynamic initializer for 'const lgraph<class Edge<class Vertex<int,int>,int> >::`vftable'''(void)" (???__E??_7?$lgraph@V?$Edge@V?$Vertex@HH @@H@@@@6B@@@YMXXZ@?A0x0f4d3fa0@@$$FYMXXZ )

(((
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
31.08.2011, 02:41
Это уже ошибки компоновщика, то есть програма уже компилируется.
В классе lgraph объявлена виртуальная функция g_insert_edge, но определения её нигде нет.
И я не уверен, что в базовом классе деструктор стоит делать чистым.
Я бы его просто виртуальным сделал, с пустым телом:
C++
1
virtual ~vgraph() {}
Добавлено через 4 минуты
В общем, в любом случае, будет ли деструктор в базовом классе "чистой" функцией или нет, его обязательно надо определить.
1
 Аватар для gretham
19 / 19 / 1
Регистрация: 12.08.2011
Сообщений: 59
31.08.2011, 02:44  [ТС]
Огромное спасибо, все вышеописанное помогло!

0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
31.08.2011, 09:04
Цитата Сообщение от grizlik78 Посмотреть сообщение
будет ли деструктор в базовом классе "чистой" функцией или нет, его обязательно надо определить.
Ну да, деструктор же не наследуется. Так что Страуструп, мне кажется, погорячился, распространив на него понятие виртуальности, а тем более чистой виртуальности.
0
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
31.08.2011, 16:53
деструктор то как раз наследуется,
не наследуются конструкторы и оператор = по-моему .
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
31.08.2011, 19:42
Цитата Сообщение от OstapBender Посмотреть сообщение
деструктор то как раз наследуется
Ну вы даете!
0
 Аватар для Alex1234
13 / 13 / 2
Регистрация: 11.02.2011
Сообщений: 55
01.09.2011, 09:42
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну вы даете!
Да вы оба хороши, рассуждать, наследуется или не наследуется деструктор - это сильно.
0
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
01.09.2011, 11:25
Alex1234, а што такова?

Mr.X, problem officer?


пс: как тут картинки прикреплять?
0
Заблокирован
01.09.2011, 11:35
наследуется виртуальность\невиртуальность. Деструктор по умолчанию - невиртуальный. Сами деструкторы не наследуются.
0
 Аватар для Alex1234
13 / 13 / 2
Регистрация: 11.02.2011
Сообщений: 55
01.09.2011, 12:35
Извините если кого задел. Вот все что я думаю:
Каждый производный класс при своем уничтожении вызывает деструктор базового класса. Если деструктор базового класса объявляется виртуальным, то и все деструкторы последующих производных классов будут виртуальными.
Более того деструктор базового класса может быть чисто виртуальной функцией. Но при этом в отличии от обычных чисто виртуальных функций чисто виртуальный деструктор всегда должен иметь определение, так как деструкторы производных классов неявно вызывают деструктор базового класса.
Ключевое слово virtual можно опускать для виртуальных функций, унаследованных от базового класса, в производных классах.
Может чего и упустил.
Фразы вида "Деструкторы не наследуются" выносят мозг.
0
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
01.09.2011, 13:21
LosAngeles, не очень понял к чему это?
деструктор по моему такая обычная функция как и все и наследуется, т.к её можно явно вызвать из производного класса *

Alex1234, всё норм.

Цитата Сообщение от Alex1234 Посмотреть сообщение
Если деструктор базового класса объявляется виртуальным, то и все деструкторы последующих производных классов будут виртуальными.
ага, теперь понял что имел ввиду ЛосАнжелес .

Цитата Сообщение от Alex1234 Посмотреть сообщение
Более того деструктор базового класса может быть чисто виртуальной функцией. Но при этом в отличии от обычных чисто виртуальных функций чисто виртуальный деструктор всегда должен иметь определение, так как деструкторы производных классов неявно вызывают деструктор базового класса.
где-то читал подобное, но толковых примеров не видел. примерчик можно? *

Цитата Сообщение от Alex1234 Посмотреть сообщение
Ключевое слово virtual можно опускать для виртуальных функций, унаследованных от базового класса, в производных классах.
по-моему там есть разница с ключевым словом или нет... *

Цитата Сообщение от Alex1234 Посмотреть сообщение
Фразы вида "Деструкторы не наследуются" выносят мозг.
так вы всё таки на стороне зла или добра?

по вопросам отмеченным звездой хотелось бы услышать мнение эксперта, т.к сам плохо разбераюсь в сабже. желательно с ссылкой на авторитетный источник. спасибо.
0
 Аватар для Alex1234
13 / 13 / 2
Регистрация: 11.02.2011
Сообщений: 55
01.09.2011, 13:49
> где-то читал подобное, но толковых примеров не видел. примерчик можно? *

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Dad
{
public:
    virtual ~Dad() = 0;
    virtual void DoSomething() = 0;
};
 
Dad::~Dad()   //Вот это обязалока
{
}
 
void Dad::DoSomething()
{
}
 
int main()
{
}
> по-моему там есть разница с ключевым словом или нет... *

Нет, если в каком нибудь классе метод был виртуальным, таковым он будет и в производных, модификатор virtual стоит указывать явно, чтоб не вводить никого в заблуждение.

> так вы всё таки на стороне зла или добра?

Кода нибудь я познаю светлую сторону силы.

Добавлено через 18 минут
Мда, выражение "Деструкторы не наследуются" присутствует в литераторе, наверно это мои личные проблемы, ну да фиг с ним.

 Комментарий модератора 
Используйте теги форматирования кода!
1
Заблокирован
01.09.2011, 13:51
Цитата Сообщение от OstapBender Посмотреть сообщение
желательно с ссылкой на авторитетный источник
final draft С++11
3242

Цитата Сообщение от OstapBender Посмотреть сообщение
Но при этом в отличии от обычных чисто виртуальных функций чисто виртуальный деструктор всегда должен иметь определение
A destructor can be declared virtual (10.3) or pure virtual (10.4); if any objects of that class or any derived class are created in the program, the destructor shall be defined.

Цитата Сообщение от OstapBender Посмотреть сообщение
так как деструкторы производных классов неявно вызывают деструктор базового класса
After executing the body of the destructor and destroying any automatic objects allocated within the body, a destructor for class X calls the destructors for X’s direct non-variant members, the destructors for X’s direct base classes and, if X is the type of the most derived class (12.6.2), its destructor calls the destructors for X’s virtual base classes. All destructors are called as if they were referenced with a qualified name, that is, ignoring any possible virtual overriding destructors in more derived classes. Bases and members are destroyed in the reverse order of the completion of their constructor

1
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
01.09.2011, 13:55
Цитата Сообщение от Alex1234 Посмотреть сообщение
выражение "Деструкторы не наследуются" присутствует в литераторе
Имеется в виду, что каждый производный класс будет иметь собственный деструктор, описанный явно или сгенерированный компилятором. В отличие от всех остальных виртуальных функций, которые могут быть замещены, а могут просто унаследоваться без изменений. С деструктором такой номер не проходит и он создаётся всегда.
0
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
01.09.2011, 15:12
Alex1234, ага
Цитата Сообщение от Alex1234 Посмотреть сообщение
Нет, если в каком нибудь классе метод был виртуальным, таковым он будет и в производных, модификатор virtual стоит указывать явно, чтоб не вводить никого в заблуждение.
вот это хорошо

LosAngeles, спасибо,
ну что касается фразы "...так как деструкторы производных классов неявно вызывают деструктор базового класса."
это случайно попало в цитату
1
 Аватар для Alex1234
13 / 13 / 2
Регистрация: 11.02.2011
Сообщений: 55
01.09.2011, 15:38
Ну, не сосем случайно, а как без неё?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.09.2011, 15:38
Помогаю со студенческими работами здесь

Возможно ли создание объекта шаблонного класса в функции этого класса?
Доброго времени суток, уважаемые форумчане :) Мне по лабам задали задание - реализовать шаблон контейнера (множество) с операциями...

Чем отличается шаблонный метод класса от шаблонного класса?
Чем отличается шаблонный метод класса от шаблонного класса???????ПЛИЗ!!!!Если можно немного ссылок на летературу

Partial шаблонного класса (Весь основной код класса вынести в другой файл)
Здравствуйте, у меня есть главный класс, в котором содержится внутренний класс: public class DistributedArray&lt;T&gt; { //.... ...

Создание своего класса кнопки с использованием наследования от класса UserControl
Ребят, помогите, такая проблема: создаю класс MyButton в C# при помощи наследования от класса UserControl и в классе MyButton переопределяю...

Обявление шаблонного класса
Как-то с пониманием С++ вроде уже все норм, осталась только одна тема немного темная - шаблоны, вроде бы и понимаю как они работают да и...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru