View Single Post
Old 14-06-2005, 14:38   #4
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Cittā: San Jose, California
Messaggi: 11782
Quote:
Originariamente inviato da okay
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:

Codice:
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 č offline   Rispondi citando il messaggio o parte di esso