Pour l'une de mes classes, j'écris un programme qui utilisera une structure de pool de mémoire modélisée pour gérer l'allocation de nouvelles instances d'une classe tout en les maintenant ensemble. Il est actuellement déclarée comme suit:Surcharge en tant que fonction ami?
template<typename T, unsigned int N>
class MemoryPool
{
//Stuff
};
Où T
est la classe pour créer ce pool et N
est le nombre maximum d'éléments qui peuvent être placés dans la piscine. Je veux surcharger new
pour le type créé pour rendre les interactions avec le pool un peu plus facile si c'est une chose raisonnable à faire - mais je ne suis pas sûr que ce soit le cas.
Mes pensées, actuellement, sont que s'il est possible de surcharger new
en fonction ami pour T
au sein MemoryPool
qu'il devrait être faisable à partir de là, mais je ne suis pas sûr. Et, je ne suis pas sûr de la meilleure façon de commencer à le configurer. J'ai essayé quelques manières différentes de déclarer simplement le new
surchargé et j'obtiens des erreurs avant même de l'implémenter.
- Est-ce une façon raisonnable de faire en sorte que
new
est surchargée pour toute classe qui utiliseMemoryPool
? - Est-ce possible?
- Est-ce que c'est une bonne idée?
- Comment vais-je configurer la déclaration de fonction pour accomplir ceci?
Dans le cas où il importe, j'utilise Visual Studio 2010.
Note, l'utilisation spécifique des modèles et la surcharge sont new
pas partie de l'affectation des devoirs. C'est la façon dont je veux l'implémenter si possible pour rendre le reste de la tâche plus facile à lire pour l'avenir. Donc, s'il n'y a pas de moyen raisonnable de le faire, j'utilise simplement les fonctions membres au sein de MemoryPool
pour atteindre le même objectif.
Merci!
Exemple mise en œuvre:
MemoryPool<Object, MAX_OBJECTS> objectPool; //Pool to store objects
Object* allObjects[MAX_OBJECTS]; //Locations of objects
//Make a new object (this is how I'd like to do it)
allObjects[0] = new Object(/*args*/);
//(If I can't do the above, this would be the alternative)
allObjects[0] = objectPool.AllocateNewSlot();
allObjects[0]->Initialize(/*args*/);
Dans cet exemple, l'utilisation du MemoryPool
se charge de la mise en œuvre effective de new
assurer l'objet est créé dans la piscine au lieu de ne importe où sur le tas (pour assurer que tous les les objets sont dans un système centralisé, emplacement plus contrôlable.
Je ne comprends pas ce que vous voulez faire. Pourriez-vous ajouter un exemple sur la façon dont vous aimeriez l'utiliser? – ronag
@ronag Mise à jour avec exemple d'implémentation. Est ce que ça aide? – chaosTechnician
pourquoi ne pas utiliser un allocateur/suppresseur personnalisé avec std :: shared_ptr ou unique_ptr? – Rick