crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Упреждающее объявление (forward declaration) для шаблонных классов
daorus
  опции профиля:
сообщение 30.10.2010, 20:18
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 20
Регистрация: 30.10.2010
Пользователь №: 2163

Спасибо сказали: 0 раз(а)




Репутация:   0  


Какой синтаксис форвад-декларации для типа хеш, если я хочу в классе хранить на него указатель

// my.h
class QHash; // не хватает
class QString; // хватает
class my
{
    public:
    my();
    QHash<QString, QString>* dic;
};

// my.cpp
#include <QHash>
my::my()
{
    dic = new QHash<QString, QString>;
}


Сообщение отредактировал Litkevich Yuriy - 30.10.2010, 20:27
Причина редактирования: Перенёс, так как относится не к Qt, а к Си++
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Iron Bug
  опции профиля:
сообщение 31.10.2010, 12:08
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(daorus @ 31.10.2010, 13:55) *
Исторически появились как необходимость кросс-вставки классов.

воот. так что кроме ссылок на самого себя и циклических ссылок это, конечно, можно, но нафиг нигде не нужно. ибо всё,что нужно компилеру - это увидеть описание класса до его использования в коде, что, в случае простого использования класса, достигается вставкой инклюда в одном месте кода, как правило в заголовочнике, где он используется. а в обычном случае, без циклических ссылок, предварительные объявления без инклюда, тем более для стандартно или библиотечно определённых шаблонов, ни к чему, кроме ещё одного лишнего прохода при компиляции, не приводят. куда ты его вставишь - дело десятое. если класс сам по себе используется, то компилятор обработает его один раз. так что "экономия" времени компиляции будет только в случае библиотеки, которая оперирует только указателями и никогда не обращается к самому классу.

Цитата(Алексей1153 @ 31.10.2010, 13:34) *
о да. Столкнулся несколько раз, пытался решить, спрашивал советы - так и оставил в заголовочнике весь шаблон.

я как-то тоже напоролась на это. это баг мелкософта. об этом написано где-то в MSDN, только мелким-мелким шрифтом на страничке, которую так просто и не найти :) там порядка восьми несовместимостей со стандартом у них имеется. в прочих компилерах этого нет.

Цитата(daorus @ 31.10.2010, 13:55) *
Топик начался с того, что для шаблонных классов создание обычной декларации не катит, а как катит я не знал. И тут мне на форуме подсказали супер-мегафичу, которую я домыслил и оказалось, что для шаблонов форвард-декларацией является как бы создание экземлпяра шаблона! + кстати, подсказанный пример можно существенно сократить, выкинув сигнатуры классов в шаблоне KEY, T. Главное - сохранить кол-во классов в шаблоне.

всё объясняется проще: когда мелкософтовский компилер собирает модули, он считает, что если нет экземпляра шаблонного класса - то его описание можно просто выкинуть. это и есть баг компилера, его несоответствие стандарту. просто для MSVC нужно, чтобы либо инклюд был явно включен в файл, где шаблон будет использован, либо вот так вот, как ты описал, извратиться и заставить компилер учесть шаблонный класс методом создания фиктивного объекта.

Сообщение отредактировал Iron Bug - 31.10.2010, 12:25
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- daorus   Упреждающее объявление (forward declaration) для шаблонных классов   30.10.2010, 20:18
- - Алексей1153   помести #include <QHash> #include <QStri...   30.10.2010, 20:25
- - Litkevich Yuriy   Здесь для QString этот номер не пройдёт, т.к. испо...   30.10.2010, 20:30
- - kwisp   интересный вопрос. что на данный вопрос отвечает г...   30.10.2010, 20:33
- - Litkevich Yuriy   Цитата(kwisp @ 30.10.2010, 23:33) а ссыло...   30.10.2010, 20:46
- - Алексей1153   ссылка - также, как и указатель. Потому что это од...   30.10.2010, 20:51
- - igor_bogomolov   Цитата(daorus @ 30.10.2010, 21:18) Какой ...   30.10.2010, 21:25
- - Алексей1153   Игорь, сильно сомневаюсь template <class Key, ...   30.10.2010, 21:52
- - igor_bogomolov   Цитата(Алексей1153 @ 30.10.2010, 22:52) И...   30.10.2010, 22:07
- - Алексей1153   igor_bogomolov, всё, дошло до меня Я просто никог...   30.10.2010, 22:15
- - daorus   Цитата(igor_bogomolov @ 31.10.2010, 0:25)...   31.10.2010, 0:00
- - Litkevich Yuriy   daorus, лучше следовать правилу: Одна проблема (во...   31.10.2010, 0:45
- - Iron Bug   Цитата(daorus @ 30.10.2010, 22:18) Какой ...   31.10.2010, 11:08
- - Litkevich Yuriy   Цитата(Iron Bug @ 31.10.2010, 14:08) когд...   31.10.2010, 11:30
- - Алексей1153   Цитата(Iron Bug @ 31.10.2010, 14:08) то е...   31.10.2010, 11:34
- - daorus   Iron Bug, во-первых, привет земляку. Я тоже из Ека...   31.10.2010, 11:55
- - Iron Bug   Цитата(daorus @ 31.10.2010, 13:55) Истори...   31.10.2010, 12:08
- - Алексей1153   экономия времени будет. По крайней мере в студии э...   31.10.2010, 12:52
- - igor_bogomolov   Цитата(Iron Bug @ 31.10.2010, 11:08) с MS...   31.10.2010, 13:34
- - daorus   Цитата(Iron Bug @ 31.10.2010, 14:08) дост...   31.10.2010, 13:47
- - Алексей1153   Цитата(daorus @ 31.10.2010, 16:41) Привык...   31.10.2010, 13:50
- - igor_bogomolov   Цитата(daorus @ 31.10.2010, 13:47) Но поч...   31.10.2010, 14:09


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


8 чел. читают эту тему (гостей: 8, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 22.12.2024, 5:26