Qt - nejde template class na Q_OBJECT – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Qt - nejde template class na Q_OBJECT – C / C++ – Fórum – Programujte.comQt - nejde template class na Q_OBJECT – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
crow
~ Anonymní uživatel
14 příspěvků
11. 3. 2012   #1
-
0
-

Zdravim,
mám takový problém a nějak nechápu, proč mi nejde použít generický typ na třídu, která používá Q_OBJECT.

Mám tyto třídy - Core, A, AEx... kde Core je hlavní třída, která vytváří mapu dle vstupního typu a třída A je hlavní třída objektu a AEx je potomek, co dědí z hlavní třídy A..
Viz. příklad:

Třída Core:

#include <QObject>
#include <QMap>

template <class T>
class Core : public QObject
{
    Q_OBJECT

public:
    explicit Core(QObject *parent = 0);
    void add(T *item);

private:
    QMap<int, T*> *_array;
};

--------------------------------------------

#include "Core.h"

template <class T>
Core<T>::Core(QObject *parent) : QObject(parent)
{
    _array = new QMap<int, T>();
}

template <class T>
void Core<T>::add(T *item)
{
    _array->insert(item->ID(), item);
}

Třída A, která je základ:

#include <QObject>

class A : public QObject
{
    Q_OBJECT

public:
    explicit A(int id, QObject *parent = 0);
    int ID() const;

private:
    int _id;
};

----------------------------------------------

#include "A.h"

A::A(int id, QObject *parent) : QObject(parent)
{
    _id = id;
}

int A::ID() const
{
    return _id;
}

A třída AEx, která rozšiřuje základní třídu A:

#include "A.h"

class AEx : public A
{
    Q_OBJECT

public:
    explicit AEx(int id, QObject *parent = 0);
    void setName(QString name);
    QString Name() const;

private:
    QString _name;
};

----------------------------------------------

#include "AEx.h"

AEx::AEx(int id, QObject *parent) : A(id, parent)
{
}

void AEx::setName(QString name)
{
    _name = name;
}

QString AEx::Name() const
{
    return _name;
}

Jde o to, že všechny třídy musí být Q_OBJECT a v mainu bych si to představoval volat jako:
 

#include "Core.h"
#include "A.h"
#include "AEx.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    
    // pomoci zakladni tridy A
    Core<A> *coreBase = new Core<A>(this);
    
    // pomoci rozsirene tridy AEx
    Core<AEx> *core = new Core<AEx>(this);
    
    w.show();
    
    return a.exec();
}

Můžete mi prosím poradit, jak mám použít tento způsob vytvoření objektu, kde si předem určím (při vytvoření instance třídy Core), o jakou třídu se má jednat, jestli A nebo AEx ?

Tento způsob je bez chyby, jen mi to píše toto a nevím jak teda mám problém vyřešit tak, jak bych si představoval :(
Chyba:Template classes not supported by Q_OBJECT


Nahlásit jako SPAM
IP: 213.168.183.–
Reklama
Reklama
crow
~ Anonymní uživatel
14 příspěvků
11. 3. 2012   #2
-
0
-

Nikdo neví? Jde mi jen o nějakou možnost, jak bych toho mohl docílit, řekněme, že třídy Core a A budou v knihovně a jak to v mainu budu volat a vytvářet, tak bych chtěl nějak rozšířit původní třídu A a použít jí přímo v Core a tady asi jiná možnost není, než kterou jsem napsal

Příklad:
udělám takového sestavení (pouze třídy Core a A), za čas si vzpomenu, že bych potřeboval, aby třída A obsahovala nějakou funkci navíc (třeba tu hodnotu name), takže bych chtěl v projektu rozšířit třídu A na AEx a následně jí použít, přičemž bych nechtěl nijak měnit třídu A, která by byla jako taková BaseClass

Nahlásit jako SPAM
IP: 213.168.183.–
meqi+1
Newbie
11. 3. 2012   #3
-
0
-

S tímto bych taky potřeboval poradit, vim, že pokud je nějaká třída jako Q_OBJECT, tak jí nelze nastavit jako generickou, jedině nastavit generický prvky do jiné ne-qobjectové třídy a tu potom zdědit...

Ale mám taky problém, pokud potřebuju odeslat nějaký generický typ přes signal a slot, tak to netuším jak vyřešit... nebo lépe - dát nějak třídě vědět dopředu (třeba při vytvoření instance), jaký objekt/třídu/typ má použít a tento typ potom alokovat v dané třídě

Nahlásit jako SPAM
IP: 213.168.183.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 80 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý