2010-10-11 15 views
11

Posso chiamare il posizionamento C++ nuovo sui costruttori con parametri? Sto implementando un allocatore personalizzato e voglio evitare di dover spostare la funzionalità da costruttori non predefiniti in una funzione di init.Posizionamento costruttori nuovi e non predefiniti

class CFoo 
{ 
public: 
    int foo; 
    CFoo() 
    { 
     foo = 0; 
    } 

    CFoo(int myFoo) 
    { 
     foo = myFoo; 
    } 
}; 

CFoo* foo = new (pChunkOfMemory) CFoo(42); 

ci si aspetterebbe un oggetto di tipo CFoo da costruire a pChunkOfMemory utilizzando il secondo costruttore. Quando si utilizza l'operatore new sono bloccato solo con i costruttori predefiniti?

Risolto! Non ho #include <new>. In seguito, chiamando placement :: new ha funzionato correttamente con i costruttori non predefiniti.

+2

Hai provato? –

+0

Sì - errore C2660: "operatore nuovo": la funzione non richiede 2 argomenti. Hai una risposta alla domanda? –

+4

Il posizionamento nuovo senza argomenti del costruttore funziona nello stesso contesto? Ti sei ricordato di '#include '? – aschepler

risposta

16

Per utilizzare nuova collocazione, è necessario includere l'intestazione <new>:

#include <new> 

caso contrario, le forme di collocamento di operator new non sono definiti.

+0

Successo! Non posso credere di aver lottato con questo tutto il giorno ed era un file di inclusione mancante. D'oh! Grazie a GMan e Aschelper. –

+0

@Chris: Yup. È facile dimenticare queste piccole intestazioni perché sono spesso incluse in altre che sono quasi sempre incluse. – GManNickG

+4

Includere '' è la risposta pratica alla domanda dell'OP, ma le informazioni fornite nella prima riga sopra non sono corrette. Uno non ha bisogno di icnlude 'new', ma la relativa funzione di allocazione' operator new' deve essere definita (come membro o nel namespace globale). Per l'OP: per essere sicuri di usare la funzione di allocazione globale dovresti generalmente scrivere ':: new', non solo' new', quando usi il posizionamento "construct in place" new; altrimenti potresti raccogliere una funzione di allocazione dei membri. –

Problemi correlati