2010-12-12 55 views
1

Je sais comment empêcher l'allocation de tas d'une classe (make new et new [] private). Je sais comment empêcher la pile et les allocations statiques (rendre le destructeur privé).C++ allocation de classes uniquement statiques

Je me demande s'il y a de toute façon à autoriser uniquement les allocations statiques au moment de la compilation?

+1

pourquoi voudriez-vous faire cela? –

+0

Je veux un ensemble d'instances de classe de configurateur statique qui seront analysées au démarrage et je ne veux pas que des instances de ceci soient créées une fois que le démarrage est fait et je voudrais qu'il soit signalé par le compilateur. – zzz777

Répondre

2

Non. Pardon. La raison en est que l'allocation statique place exactement les mêmes exigences sur le type que l'allocation automatique; il ne peut pas être distingué. Toutefois, vous pouvez empêcher le code client d'instancier votre type et autoriser l'accès à une ou plusieurs instances créées par le code du type. En général, les gens pensent souvent que les singletons, etc., sont une idée splendide, peut-être qu'ils donnent le sentiment d'être en contrôle, quoi qu'il en soit, mais de toute façon, à un moment donné, une instanciation plus générale est nécessaire. n'était pas juste gaspillé mais génère activement plus de & hellip; et complètement inutile & hellip; travail.

Donc, le conseil général est, comme pour l'optimisation prématurée, ne le faites pas.

Bien que dans certains cas, il peut être la bonne solution.

Vive & HTH.,

2

Pourquoi ne pas simplement utiliser un espace de noms? Il n'y a aucune raison d'emballer quelque chose dans une classe si vous n'en avez qu'une instance statique.

1

Il n'existe aucun moyen de forcer toutes les instances d'une classe à être statiques. Pourriez-vous créer une classe avec des membres exclusivement statiques à la place?

À mon avis, c'est mieux que d'utiliser un namespace, car les espaces de noms ne peuvent pas avoir de membres privés.

+0

Un espace de noms anonyme est essentiellement privé à l'unité de compilation. Qu'est-ce qui ne va pas avec ça? – greyfade

+0

Pourquoi avez-vous besoin d'exposer tous les détails d'implémentation à l'ensemble de l'unité de compilation? Même si cet espace de noms était dans une unité de compilation en elle-même, je ne vois aucun avantage à utiliser un espace de noms anonyme par rapport à l'utilisation d'une classe avec des membres exclusivement statiques. J'ai peut-être tort; ce ne serait pas la première fois! – ClosureCowboy

+0

Cowboy: mais il n'y a qu'une seule copie des données, ce qui dépasse les exigences de l'OP. – Yttrill