PDA

View Full Version : Novità c++ almeno per me


okay
14-06-2005, 10:44
Ho trovato questo codice che usa una chiamata nella classe come un void ma non lo è. E' una cosa che non avevo mai visto ne ho mai fatto:

l'esempio esatto della costruzione della classe del cpp e h:

//cpp
CSound3D::CSound3D(char* szFile,IDirectMusicAudioPath8* pAudioPath)
{
... ecc,ecc.
----------------

//h
class CSound3D
{
public:
CSound3D(char*,IDirectMusicAudioPath8*);
~CSound3D();
... ecc,ecc..
----------------

questa è la chiamata dal main.cpp

CSound3D Sound1("mio.wav",NULL);

bhè questo è chiaro CSound3D crea l'oggetto non puntatore e passa 2 argomenti al costrutto:
CSound3D::CSound3D(char* szFile,IDirectMusicAudioPath8* pAudioPath)

premetto che è solo a scopo di capire il perchè non mi funziona ciò che vorrei fare:

Invece di creare tanti oggetti tipo Sound1 Sound2 ecc,ecc o pensato di usare un oggetto puntatore facendo così per una matrice di oggetti:


m_pSound[Numero] = new CSound3D();
m_pSound[Numero](fileSound,NULL);
ma queste 2 linee sopra il compilatore non le digerisce

ne tantomeno questa che è improponibile anzi errata proprio:
CSound3D m_pSound[Numero](fileSound,NULL);
--------------------------------

E' corretto invece snaturare la routine della classe e fare:

void CSound3D::Inizia(char* szFile,IDirectMusicAudioPath8* pAudioPath)

e poi chiamarla cosi:
m_pSound[Numero] = new CSound3D();
m_pSound[Numero]->Inizia(fileSound,NULL);
------------

Qualcuno sa come richiamare quel CSound3D::CSound3D(char* szFile,IDirectMusicAudioPath8* pAudioPath)
{
con un oggetto puntatore come detto sopra??

ilsensine
14-06-2005, 10:55
Un semplice
m_pSound[Numero] = new CSound3D(fileSound,NULL);
non ti piace?

ri
14-06-2005, 14:13
:rotfl:

fek
14-06-2005, 14:38
m_pSound[Numero] = new CSound3D();
m_pSound[Numero](fileSound,NULL);
ma queste 2 linee sopra il compilatore non le digerisce

ne tantomeno questa che è improponibile anzi errata proprio:
CSound3D m_pSound[Numero](fileSound,NULL);


Se ho capito bene tu non vuoi un vettore di puntatori a oggetti, ma vuoi un array di oggetti e vorresti eseguire il costruttore per ogni oggetto nel vettore.

Il tuo dubbio non e' affatto stupido, anzi. A volte e' una necessita', ad esempio STL ha spesso questo problema e il C++ ha messo a disposizione una sintassi particolare per risolverlo.

Ma prima vediamo perche' il tuo primo tentativo ha fallito:

CSound3D m_pSound[Numero](fileSound,NULL);

In C++ non puoi eseguire il costruttore su un oggetto gia' creato, in quest caso il tuo vettore di oggetti e' gia' stato creato e sono gia' stati creati tutti gli oggetti al suo interno. Per standard il C++ invoca su ogni oggetto del vettore il costruttore standard e non puoi modificare questo comportamento.

La soluzione si chiama "in place construction", ed e' usata da STL, e l'idea e' di pre allocare un blocco di memoria sufficiente a contenere tutti gli oggetti che ti servono e poi costruire gli oggetti in place.

Una cosa del tipo:



BYTE buffer[sizeof(CSound3D) * NUM_OF_SOUNDS];

for (int i = 0; i < NUM_OF_SOUNDS; ++i)
{
CSound3D* pSound = reinterpret_cast<CSound3D*>(buffer) + i;
new ( (pSound) ) CSound3D(/* parametri del costruttore*/);
}

CSound3D* mySoundsArray = (CSound3D*) buffer;



Questa linea di codice chiama il costruttore al puntatore che tu passi senza allocare memoria e crea un oggetto:

new ( (pSound) ) CSound3D(/* parametri del costruttore*/);

Ovviamente vorrai allocare la memoria del vettore dinamicamente in qualche modo.
Attendo ad usare questo costrutto e fallo solo se ti semplifica il codice oppure ti da un provato miglioramento prestazionale, non tanto per usarlo.

Per saperne di piu segui questo link:
http://www.gotw.ca/publications/mill15.htm

fek
14-06-2005, 15:05
Nota OT:
Cionci, se il rapporto segnale/rumore in questo forum scende sotto una certa soglia, e' possibile eliminare il rumore con un bel filtro passa molto basso? ;)

okay
14-06-2005, 15:19
No gente x ora nulla da fare.

Quel costrutto và snaturato di sana pianta, oppure fare cosi:

CSound3D Sound1(fileSound,NULL);
CSound3D Sound2(fileSound,NULL);
...ecc,ecc (certo caricare per esempio 300 file,wav dalla dir che palle (improponibile proprio))

però questo è corretto e funziona.

vabbhè non tutte le ciambelle vengono col buco. ;)
------------------------

In sostanza
CSound3D m_pSound (fileSound,NULL); //OK
CSound3D m_pSound[Numero](fileSound,NULL); //ERRATO


ciao

fek
14-06-2005, 15:24
No gente x ora nulla da fare.

Quel costrutto và snaturato di sana pianta, oppure fare cosi:

CSound3D Sound1(fileSound,NULL);
CSound3D Sound2(fileSound,NULL);
...ecc,ecc (certo caricare per esempio 300 file,wav dalla dir che palle (improponibile proprio))

però questo è corretto e funziona.

vabbhè non tutte le ciambelle vengono col buco. ;)
------------------------

In sostanza
CSound3D m_pSound (fileSound,NULL); //OK
CSound3D m_pSound[Numero](fileSound,NULL); //ERRATO


ciao

Usi la new in-place, oppure un vettore di puntatori ai suoni (forse e' la cosa migliore), oppure std::string. Hai un po' di soluzioni possibili.

okay
14-06-2005, 16:05
Usi la new in-place, oppure un vettore di puntatori ai suoni (forse e' la cosa migliore), oppure std::string. Hai un po' di soluzioni possibili.

Intendi Usi o Usa................

io volevo fare così un puntatore ad oggetti esempio:

in h
CSound *m_pSound[255];//

in cpp
m_pSound[255]=NULL;

poi

DllCGioco *g_pGioco=NULL;
g_pGioco = new DllCGioco();

e poi

g_pGioco->m_pSound[Numero] = new CSound3D();
g_pGioco->m_pSound[Numero]->Inizia(fileSound,NULL);

.......... come sempre ho fatto
ma volevo riuscire a farlo andare (a scopo didattico )in quel:
CSound3D::CSound3D(char* szFile,IDirectMusicAudioPath8* pAudioPath)
{

fek
14-06-2005, 16:19
io volevo fare così un puntatore ad oggetti esempio:

in h
CSound *m_pSound[255];//

in cpp
m_pSound[255]=NULL;



Un vettore di puntatori va benissimo ed e' piu' semplice della new in-place.


g_pGioco->m_pSound[Numero] = new CSound3D();
g_pGioco->m_pSound[Numero]->Inizia(fileSound,NULL);


Puoi semplicemente fare cosi:
g_pGioco->m_pSound[Numero] = new CSound3D(fileSound,NULL);

Un consiglio, scrivi tutti i metodi e i commenti in inglese nel tuo codice, soprattutto se scrivi un gioco ;)