Russian Qt Forum
Ноябрь 24, 2024, 08:03 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Наследование от QCache  (Прочитано 5548 раз)
spirits25
Гость
« : Апрель 25, 2013, 13:08 »

Всем привет.

Мне понадобилось переопределить метод unlink в классе QCache, для этого нужно унаследоваться от него.

Может кто-нибудь подсказать как это правильно сделать?
Уже до этого дошёл, всё равно не могу унаследоваться нормально, пишет
Цитировать
ошибка: undefined reference to `TileCache<MyKeyClass, MyOtherClass>::TileCache(int)'
Код:
template <class MyKeyClass, class MyOtherClass>
class TileCache : public QCache<class Key, class T>
{
    struct Node {
        inline Node() : keyPtr(0) {}
        inline Node(T *data, int cost)
            : keyPtr(0), t(data), c(cost), p(0), n(0) {}
        const Key *keyPtr; T *t; int c; Node *p,*n;
    };
    Node *f, *l;
    QHash<Key, Node> hash;
    int mx, total;
public:
    inline explicit TileCache(int maxCost = 100);
};

template <class MyKeyClass, class MyOtherClass>
inline TileCache<MyKeyClass, MyOtherClass>::TileCache(int amaxCost)
    : f(0), l(0), mx(amaxCost), total(0)
{
}
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #1 : Апрель 25, 2013, 14:40 »

Всем привет.

Мне понадобилось переопределить метод unlink в классе QCache, для этого нужно унаследоваться от него.

Может кто-нибудь подсказать как это правильно сделать?
Уже до этого дошёл, всё равно не могу унаследоваться нормально, пишет
Цитировать
ошибка: undefined reference to `TileCache<MyKeyClass, MyOtherClass>::TileCache(int)'
Код:
template <class MyKeyClass, class MyOtherClass>
class TileCache : public QCache<class Key, class T>
{
    struct Node {
        inline Node() : keyPtr(0) {}
        inline Node(T *data, int cost)
            : keyPtr(0), t(data), c(cost), p(0), n(0) {}
        const Key *keyPtr; T *t; int c; Node *p,*n;
    };
    Node *f, *l;
    QHash<Key, Node> hash;
    int mx, total;
public:
    inline explicit TileCache(int maxCost = 100);
};

template <class MyKeyClass, class MyOtherClass>
inline TileCache<MyKeyClass, MyOtherClass>::TileCache(int amaxCost)
    : f(0), l(0), mx(amaxCost), total(0)
{
}

Это не правильно:
Код
C++ (Qt)
template <class MyKeyClass, class MyOtherClass>
class TileCache : public QCache<class Key, class T>
 

Почитайте побольше о шаблонах..

Код
C++ (Qt)
template <class Key, class T>
class TileCache : public QCache<Key, T>
 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
spirits25
Гость
« Ответ #2 : Апрель 25, 2013, 15:40 »

Это не правильно:
Код
C++ (Qt)
template <class MyKeyClass, class MyOtherClass>
class TileCache : public QCache<class Key, class T>
 

Почитайте побольше о шаблонах..

Код
C++ (Qt)
template <class Key, class T>
class TileCache : public QCache<Key, T>
 

На каждый переопределённый метод аля
Код:
template <class Key, class T>
inline void TileCache<Key,T>::setMaxCost(int m)
{ mx = m; trim(mx); }
пишет:
Цитировать
....: ошибка: undefined reference to `TileCache<MyClass1, MyClass2>::setMaxCost(int)'
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #3 : Апрель 25, 2013, 15:58 »


На каждый переопределённый метод аля
Код:
template <class Key, class T>
inline void TileCache<Key,T>::setMaxCost(int m)
{ mx = m; trim(mx); }
пишет:
Цитировать
....: ошибка: undefined reference to `TileCache<MyClass1, MyClass2>::setMaxCost(int)'

Хотите сказать, это он из вредности пишет?)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Serr500
Гость
« Ответ #4 : Апрель 25, 2013, 16:00 »

Что-то Вы какую-то фигню пишете. Зачем Вам в классе, производном от QCache, мембер типа QHash?
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #5 : Апрель 25, 2013, 16:09 »

На каждый переопределённый метод аля
Код:
template <class Key, class T>
inline void TileCache<Key,T>::setMaxCost(int m)
{ mx = m; trim(mx); }
пишет:
Цитировать
....: ошибка: undefined reference to `TileCache<MyClass1, MyClass2>::setMaxCost(int)'

этот код записан в .h?

Да и непонятна задача, метода unlink в QCache нет, а все остальные методы невиртуальные.
Записан
spirits25
Гость
« Ответ #6 : Апрель 25, 2013, 16:38 »

На каждый переопределённый метод аля
Код:
template <class Key, class T>
inline void TileCache<Key,T>::setMaxCost(int m)
{ mx = m; trim(mx); }
пишет:
Цитировать
....: ошибка: undefined reference to `TileCache<MyClass1, MyClass2>::setMaxCost(int)'

этот код записан в .h?

Да и непонятна задача, метода unlink в QCache нет, а все остальные методы невиртуальные.

Пытался хоть как-нибудь в .cpp засунуть, не получилось, в .h в итоге работает.
Вот кусочек из исходников Qt5:
Код:
template <class Key, class T>
class QCache
{
    struct Node {
        inline Node() : keyPtr(0) {}
        inline Node(T *data, int cost)
            : keyPtr(0), t(data), c(cost), p(0), n(0) {}
        const Key *keyPtr; T *t; int c; Node *p,*n;
    };
    Node *f, *l;
    QHash<Key, Node> hash;
    int mx, total;

    inline void unlink(Node &n) {
        if (n.p) n.p->n = n.n;
        if (n.n) n.n->p = n.p;
        if (l == &n) l = n.p;
        if (f == &n) f = n.n;
        total -= n.c;
        T *obj = n.t;
        hash.remove(*n.keyPtr);
        delete obj;
    }
.....
unlink есть (может в qt5 появился, но есть=)), и hash я добавлял, потому что иначе он его не видит (хотя странно почему не видит, должен ведь наследовать). Но спасибо, заработало, хоть и пришлось всё в .h писать.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #7 : Апрель 25, 2013, 16:46 »

Пытался хоть как-нибудь в .cpp засунуть, не получилось, в .h в итоге работает.
Вот кусочек из исходников Qt5:

unlink есть (может в qt5 появился, но есть=)), и hash я добавлял, потому что иначе он его не видит (хотя странно почему не видит, должен ведь наследовать). Но спасибо, заработало, хоть и пришлось всё в .h писать.

Изучай С++! У тебя целый ряд фундаментальных ошибок. Реализация шаблона должна быть полностью доступна в момент компиляции данного TU, контроль доступа в классе по-умолчанию private, и unlink - внутренний метод, и атрибут hash из QCache недоступен, и объявив свой hash ты его доступным не сделаешь!
« Последнее редактирование: Апрель 25, 2013, 16:48 от Alex Custov » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Апрель 26, 2013, 08:06 »

unlink есть (может в qt5 появился, но есть=)), и hash я добавлял, потому что иначе он его не видит (хотя странно почему не видит, должен ведь наследовать). Но спасибо, заработало, хоть и пришлось всё в .h писать.
А зачем Вам нужен свой unlink? Не вижу разумной цели, там трудно придумать что-то вместо LRU
Записан
spirits25
Гость
« Ответ #9 : Апрель 26, 2013, 10:42 »

Изучай С++! У тебя целый ряд фундаментальных ошибок. Реализация шаблона должна быть полностью доступна в момент компиляции данного TU, контроль доступа в классе по-умолчанию private, и unlink - внутренний метод, и атрибут hash из QCache недоступен, и объявив свой hash ты его доступным не сделаешь!

Эм.. именно так у меня работает=)
Записан
spirits25
Гость
« Ответ #10 : Апрель 26, 2013, 10:43 »

А зачем Вам нужен свой unlink? Не вижу разумной цели, там трудно придумать что-то вместо LRU

Нужно в момент удаления объекта (delete указателя) сделать с ним кое-что.
Записан
Syveren
Гость
« Ответ #11 : Апрель 26, 2013, 12:31 »

Когда QChach удаляет элементы с помощью delete.
Если перед удалением с ним нужно что-либо сделать, это можно описать в деструкторе класса.
Записан
spirits25
Гость
« Ответ #12 : Апрель 26, 2013, 13:10 »

Когда QChach удаляет элементы с помощью delete.
Если перед удалением с ним нужно что-либо сделать, это можно описать в деструкторе класса.

Этот класс переопределить (наследоваться от него) гораздо тяжелее и затратнее, чем от QCache (именно в моём случае).
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #13 : Апрель 26, 2013, 14:59 »

Эм.. именно так у меня работает=)

Это не может работать, приложи минимальный проект где это работает, и где будет только унаследованный от QCache класс и main(), где он используется.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Апрель 26, 2013, 15:13 »

Этот класс переопределить (наследоваться от него) гораздо тяжелее и затратнее, чем от QCache (именно в моём случае).
Трудновато представить такой вариант Улыбающийся Ну хорошо, Ваша задача, Вам виднее, но тогда почему не класс-обертка кешируемого?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.119 секунд. Запросов: 23.