Russian Qt Forum

Qt => Общие вопросы => Тема начата: spirits25 от Апрель 25, 2013, 13:08



Название: Наследование от QCache
Отправлено: 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)
{
}


Название: Re: Наследование от QCache
Отправлено: m_ax от Апрель 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>
 


Название: Re: Наследование от QCache
Отправлено: spirits25 от Апрель 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)'


Название: Re: Наследование от QCache
Отправлено: m_ax от Апрель 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)'

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


Название: Re: Наследование от QCache
Отправлено: Serr500 от Апрель 25, 2013, 16:00
Что-то Вы какую-то фигню пишете. Зачем Вам в классе, производном от QCache, мембер типа QHash?


Название: Re: Наследование от QCache
Отправлено: Alex Custov от Апрель 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 нет, а все остальные методы невиртуальные.


Название: Re: Наследование от QCache
Отправлено: spirits25 от Апрель 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 писать.


Название: Re: Наследование от QCache
Отправлено: Alex Custov от Апрель 25, 2013, 16:46
Пытался хоть как-нибудь в .cpp засунуть, не получилось, в .h в итоге работает.
Вот кусочек из исходников Qt5:

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

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


Название: Re: Наследование от QCache
Отправлено: Igors от Апрель 26, 2013, 08:06
unlink есть (может в qt5 появился, но есть=)), и hash я добавлял, потому что иначе он его не видит (хотя странно почему не видит, должен ведь наследовать). Но спасибо, заработало, хоть и пришлось всё в .h писать.
А зачем Вам нужен свой unlink? Не вижу разумной цели, там трудно придумать что-то вместо LRU


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

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


Название: Re: Наследование от QCache
Отправлено: spirits25 от Апрель 26, 2013, 10:43
А зачем Вам нужен свой unlink? Не вижу разумной цели, там трудно придумать что-то вместо LRU

Нужно в момент удаления объекта (delete указателя) сделать с ним кое-что.


Название: Re: Наследование от QCache
Отправлено: Syveren от Апрель 26, 2013, 12:31
Когда QChach удаляет элементы с помощью delete.
Если перед удалением с ним нужно что-либо сделать, это можно описать в деструкторе класса.


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

Этот класс переопределить (наследоваться от него) гораздо тяжелее и затратнее, чем от QCache (именно в моём случае).


Название: Re: Наследование от QCache
Отправлено: Alex Custov от Апрель 26, 2013, 14:59
Эм.. именно так у меня работает=)

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


Название: Re: Наследование от QCache
Отправлено: Igors от Апрель 26, 2013, 15:13
Этот класс переопределить (наследоваться от него) гораздо тяжелее и затратнее, чем от QCache (именно в моём случае).
Трудновато представить такой вариант :) Ну хорошо, Ваша задача, Вам виднее, но тогда почему не класс-обертка кешируемого?