|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
[C++]Funzione statica in una gerarchia di oggetti...
Ho bisogno di creare una gerarchia di oggetti... Questi oggetti devono contenere una funzione statica (mi serve statica perchè la devo lanciare come thread)...
Vorrei però che questa funzione sia anche virtuale e nell'oggeto base non venga implementata... Faccio un esempio di quello che vorrei fare: Codice:
class A {
virtual static DWORD WINAPI ThreadFunction(LPVOID lpParameter) = 0;
public:
A();
HANDLE Start();
};
HANDLE A::Start()
{
return CreateThread(NULL, 10240, ThreadFunction, (LPVOID)this, 0, &threadID);
}
class B: public A {
virtual static DWORD WINAPI ThreadFunction(LPVOID lpParameter);
};
DWORD B::ThreadFunction(LPVOID lpParameter)
{
while(1) {
/*...*/
}
}
Ora...io avevo pensato ad un modo per aggirare il problema... Codice:
class A {
static DWORD WINAPI ThreadFunction(LPVOID lpParameter);
virtual DWORD Thread() = 0;
public:
A();
HANDLE Start();
};
HANDLE A::Start()
{
return CreateThread(NULL, 10240, ThreadFunction, (LPVOID)this, 0, &threadID);
}
DWORD A::ThreadFunction(LPVOID lpParameter)
{
//In lpParameter passo il puntatore a this
return ((A*)lpParameter)->Thread();
}
class B: public A {
virtual DWORD Thread();
};
DWORD B::Thread()
{
while(1) {
/*...*/
}
}
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Sì mi sembra buona
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Mar 2002
Città: Italy/Usa
Messaggi: 2817
|
Ma il linguaggio C sta per C..ionci?
Ottima idea!
__________________
"Utilizzando atomi pentavalenti drogheremo il silicio di tipo n; Utilizzando atomi trivalenti drogheremo il silicio di tipo p; Utilizzando della cannabis ci drogheremo noi e vedremo il silicio fare cose impossibili" - DSDT-HowTo |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Thanks...poi vi farò vedere il risultato...
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ho un altro problema simile...
E per un singleton come faccio ? Non posso derivarlo... Codice:
class sing {
static sing*_inst;
protected:
sing() { Load(); };
public:
static sing* GetIstance();
virtual bool Load() = 0;
virtual bool GetParam(...); /*le ho messe solo per bellezza*/
virtual bool SetParam(...);
};
sing::_inst = NULL;
public A: public sing {
public:
virtual bool Load() { /*...*/ };
};
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
No azz...non va bene la GetInstance...
Codice:
sing* sing::GetInstance(){
if(_inst == NULL)
_inst = new sing;
return _inst;
}
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Qui non ti posso dire nulla, i singleton non esistono dalle mie parti...
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#11 | |
|
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Quote:
Come li vorresti utilizzare i due singleton ? (considerarli due distinti, considerarli uguali...) |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ti spiego quello che volevo fare....
Io volevo fare una classe base astratta per cui solo definendo la funzione Load la classe derivata era utilizzabile come singleton... Codice:
class A {
/*quello che ci dovrà essere*/
public:
static A *GetIstance();
};
class B: public A {
private:
B();
bool Load();
};
B::GetIstance()->(proprietà o metodi vari definiti in B);
|
|
|
|
|
|
#13 |
|
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Ma il metodo load dovrebbe impostare il campo inst?
Comunque potresti utilizzare qualcosa del genere Codice:
template <class T>
class singleton : public T
{
singleton(){}
static T* inst;
bool loaded;
public:
static void init()
{
if ( ! loaded )
{
loaded = true;
// oppure un qualsiasi altro metodo statico di T
inst = new T();
}
}
static T& instance()
{
return *inst;
}
static const T& instance() const
{
return *inst;
}
};
class A
{
protected:
A();
};
/* ... */
typedef singleton<A> sin;
sin::init(...);
sin::instance().something( ... );
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Comunque la tua soluzione è interessante...magari l'unica cosa è che non obbligo ad implementare in A un metodo chiamato Load... |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:21.



















