2010-10-11 32 views
11

Puis-je appeler le placement C++ sur des constructeurs avec des paramètres? J'implémente un allocateur personnalisé et je veux éviter d'avoir à déplacer des fonctionnalités de constructeurs non-par défaut dans une fonction init.Placement de nouveaux constructeurs et de constructeurs par défaut

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

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

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

j'attendre un objet de type OOFC à être construit à l'aide du deuxième pChunkOfMemory constructeur. Lors de l'utilisation de l'opérateur new suis-je bloqué avec les constructeurs par défaut uniquement?

Résolu! Je n'ai pas #include <new>. Après cela, appeler placement :: new a bien fonctionné avec les constructeurs autres que ceux par défaut.

+2

Avez-vous essayé? –

+0

Oui - erreur C2660: 'opérateur nouveau': la fonction ne prend pas 2 arguments. Avez-vous une réponse à la question? –

+4

Est-ce que le placement nouveau sans arguments constructeur fonctionne dans le même contexte? Vous souvenez-vous de '#include '? – aschepler

Répondre

16

Pour utiliser le placement nouveau, vous devez inclure l'en-tête <new>:

#include <new> 

Sinon, les formes de placement de operator new ne sont pas définis.

+0

Succès! Je ne peux pas croire que j'ai lutté avec cela toute la journée et c'était un fichier d'inclusion manquant. D'oh! Merci GMan et aschelper. –

+0

@Chris: Oui. Il est facile d'oublier ces petits en-têtes car ils sont souvent inclus par d'autres qui sont presque toujours inclus. – GManNickG

+4

Y compris '' est la réponse pratique à la question de l'OP, mais l'information donnée dans la première ligne ci-dessus est incorrecte. Il n'est pas nécessaire d'utiliser icnlude 'new', mais la fonction d'allocation' operator new' doit être définie (en tant que membre ou dans l'espace de noms global). Pour l'OP: pour être sûr d'utiliser la fonction d'allocation globale, vous devez généralement écrire ':: new', pas seulement' new', lorsque vous utilisez le "construct in place" placement new; sinon, vous pourriez choisir une fonction d'allocation de membre. –