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