|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Utente sospeso
Iscritto dal: Oct 2002
Messaggi: 2156
|
[C++ estremo] derivare classe template da un'ADT non template + polimorfismo
(serve per lavoro) mi è venuta quest'idea;
Vorrei sapere se esistono controindicazioni derivando una classe template da una classe astratta NON TEMPLATE e usando il polimorfismo (nella fattispecie usare una puntatore a classe (astratta) per istanziare istanziazioni del template e biding dinamico sulle istanze delle istanziazioni......) compilare compila....ma non tutto cioè che compila funziona (mentre cioè che funziona sicuramente compila
__________________
sign editata dallo staff |
|
|
|
|
|
#2 |
|
Utente sospeso
Iscritto dal: Oct 2002
Messaggi: 2156
|
dimenticavo: nella classe template derivata c'è un template dell'STL che va istanziato con lo stesso tipo che istanzia la classe template derivata
__________________
sign editata dallo staff |
|
|
|
|
|
#3 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
|
|
|
|
|
#4 |
|
Utente sospeso
Iscritto dal: Oct 2002
Messaggi: 2156
|
penso di esserci riuscito.....
finora non ho trovato controindicazioni.
__________________
sign editata dallo staff |
|
|
|
|
|
#5 |
|
Utente sospeso
Iscritto dal: Oct 2002
Messaggi: 2156
|
confermo che funziona e che al momento non vedo altri modi per utilizzare il polimorfismo con classi template.....se la classe base (adt o no) è anch'essa una classe template non è possibile istanziare un 'istanziazione template di classe derivata utilizzando un puntatore alla classe base template (almeno così afferma stoutrup...... con le classi non template invece si può, ovviamente)
__________________
sign editata dallo staff |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
Quote:
Ultima modifica di AngeL) : 29-08-2006 alle 10:55. |
|
|
|
|
|
|
#7 |
|
Utente sospeso
Iscritto dal: Oct 2002
Messaggi: 2156
|
"il c++ è un linguaggio a riga di comando...come può gestire la grafica ??"
non la scorderò mai
__________________
sign editata dallo staff |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Jun 2006
Città: Inverno: Novgorod. Estate: Haifa
Messaggi: 879
|
Quote:
Premetto che oggi sono stanco, ma non capisco questo 3d... sembra un monologo di pensieri
__________________
Hosti non solum dandam esse viam ad fugiendum, sed etiam muniendam / Ceterum censeo Carthaginem esse delendam / Et facere et pati fortia romanum est / Nemo Romanorum pacis mentionem habere dignatus est / Roma locuta, causa finita Milla |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
Quote:
|
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Jun 2006
Città: Inverno: Novgorod. Estate: Haifa
Messaggi: 879
|
Quote:
__________________
Hosti non solum dandam esse viam ad fugiendum, sed etiam muniendam / Ceterum censeo Carthaginem esse delendam / Et facere et pati fortia romanum est / Nemo Romanorum pacis mentionem habere dignatus est / Roma locuta, causa finita Milla |
|
|
|
|
|
|
#11 | |
|
Utente sospeso
Iscritto dal: Oct 2002
Messaggi: 2156
|
Quote:
__________________
sign editata dallo staff |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Tra l'altro mi sembra un qualcosa che può risultare utile in diverse occasioni, non capisco perchè su internet non si trovi praticamente niente a riguardo. Anch'io avevo chiesto tempo fa sul forum informazioni sull'argomento, ma non ottenni risposta. |
|
|
|
|
|
|
#13 |
|
Utente sospeso
Iscritto dal: Oct 2002
Messaggi: 2156
|
a me ha risparmiato di scrivere una ventina di classi praticamente tutte uguali....davvero una buona cosa....penso tu possa facilmente immaginare la difficoltà di gestire così tante classi in caso di bachetti o aggiunte..... i template a volte sono veramente utilissimi.....
resta da capire perchè non si possa utilizzare il polimorfismo con una classe base template...questo ancora non sono riuscito a capirlo....
__________________
sign editata dallo staff |
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Jun 2006
Città: Inverno: Novgorod. Estate: Haifa
Messaggi: 879
|
Quote:
__________________
Hosti non solum dandam esse viam ad fugiendum, sed etiam muniendam / Ceterum censeo Carthaginem esse delendam / Et facere et pati fortia romanum est / Nemo Romanorum pacis mentionem habere dignatus est / Roma locuta, causa finita Milla |
|
|
|
|
|
|
#15 |
|
Utente sospeso
Iscritto dal: Oct 2002
Messaggi: 2156
|
confermo dopo ulteriori test che l'idea funziona, l'unica cosa che non mi piace tanto è il fatto che il tipo di ritorno e i parametri dei metodi virtuali puri devono essere dei void* (almeno io non ho trovato altri modi di "fregare" il compilatore ) invece del parametro della classe template derivata (come verrebbe naturale pensare), e questo mi costringe a fare un sacco di cast.... magari dopo posto un po' di codice (non posso postare quello originale perchè è roba di lavoro e sono tenuto al riserbo...
) adattato per far capire qual'è il problema....ogni suggerimento sarà bene accetto, avevo intenzione di wrappare questi cast con un'ulteriore derivazione , ma questo è un palliativo perchè i cast ci sono sempre!
__________________
sign editata dallo staff |
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
tu ha una classe base non template come la seguente Codice:
class Base {
virtual void* foo() = 0;
};
Codice:
template <typename T>
class Derived<T> : Base {
void* foo(){ /* blah */ }
};
Codice:
vector<Base*> v(10); v[0] = new Derived<int>(); v[1] = new Derived<float>(); ... v[1]->foo(); Il problema del dover ritornare void* e' dovuto al fatto che le funzioni devono avere lo stesso tipo, forse potresti usare una classe base comune (nel tuo caso probabilmente proprio Base) al posto di void*. Codice:
class Base {
virtual Base* foo(Base*) = 0;
};
template <typename T>
class Derived<T> : Base {
Base* foo(Base* arg);
};
vector<Base*> v(10);
v[0] = new Derived<int>();
v[1] = new Derived<float>();
...
v[1]->foo(0);
![]() [disclaimer]: E' un bel po' che non programmo regolarmente in C++, perdonate eventuali errori e/o omissioni nel codice
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
|
#17 | |
|
Utente sospeso
Iscritto dal: Oct 2002
Messaggi: 2156
|
il problema è esattamente quello, e anch'io avevo pensato alla tua stessa soluzione prima di accorgermi che in quel modo modo si instaura un fenomeno ricorsivo infinito... appena ho tempo posto un codicillo che illustra il problema
Quote:
__________________
sign editata dallo staff |
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Questa è la soluzione che ho adottato io: Codice:
class Base
{
private:
Base * mDerived;
public:
template <typename T> int Get(T*x, int nElements)
{
return ((Derived<T>*) mDerived)->Extract(x, nElements);
}
}
template <class T> class BaseT : public Base
{
private:
queue<T> mQueue;
public:
int Extract(T * x, int nElements)
{
//estrai da mQueue nElements se possibile, inseriscili in x e ritorna il numero di elementi estratti dalla coda.
}
}
Rimane sempre un cast al tipo della classe derivata, ma viene automaticamente determinato dal metodo template invocato. Senza cast non mi riesce. |
|
|
|
|
|
|
#19 |
|
Utente sospeso
Iscritto dal: Oct 2002
Messaggi: 2156
|
eccomi qua...sono rientrato dopo due settimane di ferie
__________________
sign editata dallo staff |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:09.











) adattato per far capire qual'è il problema....








