crossplatform.ru

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

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> Упреждающее объявление (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, а к Си++
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 30.10.2010, 20:25
Сообщение #2


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

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


помести
#include <QHash>
#include <QString>
в заголовочный файл

ну а если поизвращаться всё равно надо, то сделай класс-оболочку, а вот его уже форвардни :)

Сообщение отредактировал Алексей1153 - 30.10.2010, 20:26
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 30.10.2010, 20:30
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Здесь для QString этот номер не пройдёт, т.к. используются не указатели на него.

Вообще forward declaration возможен только в случае применения указателей. Т.к. их размер (в памяти) постоянен
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 30.10.2010, 20:33
Сообщение #4


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


интересный вопрос. что на данный вопрос отвечает гугл?
просто так пальцем в небо.
template <>
class QHash<QString, QString>;
не схавает?
а вообще конечно - такого рода штуки могут быть непереносимы так что, можно и отказаться от такого рода forward declaration

Цитата(Litkevich Yuriy @ 30.10.2010, 21:30) *
в случае применения указателей.

а ссылок?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 30.10.2010, 20:46
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(kwisp @ 30.10.2010, 23:33) *
а ссылок?
тут не уверен, возможно, тоже пройдёт
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 30.10.2010, 20:51
Сообщение #6


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

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


ссылка - также, как и указатель. Потому что это одно и тоже для компилятора :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 30.10.2010, 21:25
Сообщение #7


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

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


Цитата(daorus @ 30.10.2010, 21:18) *
Какой синтаксис форвад-декларации для типа хеш, если я хочу в классе хранить на него указатель
Да все просто на самом деле

class QString;
template <class Key, class T>
class QHash;

class my
{
    public:
    my();
    QHash<QString, QString>* dic;
};

// my.cpp
#include <QHash>
my::my()
{
    dic = new QHash<QString, QString>;
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 30.10.2010, 21:52
Сообщение #8


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

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


Игорь, сильно сомневаюсь

template <class Key, class T>
class QHash;

QHash<QString, QString>* dic;

а ты проверил, компилится ?

Будет ведь переопределение класса QHash из его инклуда

Сообщение отредактировал Алексей1153 - 30.10.2010, 21:53
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 30.10.2010, 22:07
Сообщение #9


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

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


Цитата(Алексей1153 @ 30.10.2010, 22:52) *
Игорь, сильно сомневаюсь
На всякий случай проверил, все работает. Хотя и так знал. В исходниках Qt довольно часто используется такое предварительное объявление шаблонных классов.

Цитата(Алексей1153 @ 30.10.2010, 22:52) *
Будет ведь переопределение класса QHash из его инклуда
Вообще этой фразы не понял. Какое еще переопределение?
В .h файле нам всего лишь нужно указать тип класса. Никаких уточнений не нужно, так как создается указатель и инстанцирования не происходит. В момент инстанцирования вся информация о параметрах шаблона уже есть
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 30.10.2010, 22:15
Сообщение #10


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

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


igor_bogomolov, всё, дошло до меня :) Я просто никогда так не предопределял шаблоны
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 21.12.2024, 19:24