Comment puis-je supprimer manuellement une instance d'une classe?
Comment puis-je supprimer manuellement une instance d'une classe?
Exemple:
#include <iostream>
#include <cstring>
class Cheese {
private:
string brand;
float cost;
public:
Cheese(); //Default constructor
Cheese(string brand, float cost); //Parametrized constructor
Cheese(const Cheese & rhs); //Copy construtor
~Cheese(); //Destructor
//etc... other useful stuff follows
}
int main() {
Cheese cheddar("Cabot Clothbound", 8.99);
Cheese swiss("Jarlsberg", 4.99);
whack swiss;
//fairly certain that "whack" is not a keyword,
//but I am trying to make a point. Trash this instance!
Cheese swiss("Gruyère",5.99);
//re-instantiate swiss
cout << "\n\n";
return 0;
}
Comment est "Cabot en toile," Cheddar - Vient de nulle part à proximité de Cheddar
Une variable (instance d'une classe) déclaré sur la pile peut avoir son mémoire à zéro avec
en.wikipedia.org/wiki/Cheddar_cheese
Ce n'est pas comme du champagne. Ce n'est pas un terme protégé. Le nom fait référence à la recette qui est née au Cheddar. Un peu comme les millions de dollars "à l'Américaine" gris écureuils dont les parents et grands-parents ont même jamais entendu parler de l'Amérique laisser seuls ensemble de la patte!
Je sais que - malheureusement - mais l'anglais des trucs de Cheddar est le meilleur. Aussi le champagne est une autre invention anglaise.Raté encore une fois 🙁
Une variable (instance d'une classe) déclaré sur la pile peut avoir son mémoire à zéro avec
memset
(ce qui serait utile dans certains cas, je suppose...), mais sa mémoire ne peut pas être libéré jusqu'à la fin de la portée de la fonction vous avez déclaré dans (jusqu'à la fin de votre principal ici). Vous pouvez simplement remplacer votre contenu variable avec le constructeur de copie si vous voulez vraiment rester sur la pile, mais pourquoi ne pas utiliser le tas et les pointeurs dans ce cas, où vous pouvez delete
votre instance?en.wikipedia.org/wiki/Cheddar_cheese
Ce n'est pas comme du champagne. Ce n'est pas un terme protégé. Le nom fait référence à la recette qui est née au Cheddar. Un peu comme les millions de dollars "à l'Américaine" gris écureuils dont les parents et grands-parents ont même jamais entendu parler de l'Amérique laisser seuls ensemble de la patte!
Je sais que - malheureusement - mais l'anglais des trucs de Cheddar est le meilleur. Aussi le champagne est une autre invention anglaise.Raté encore une fois 🙁
OriginalL'auteur kmiklas | 2016-03-24
Vous devez vous connecter pour publier un commentaire.
Sans connaître les cas d'utilisation ou le problème que vous souhaitez résoudre (veuillez lire sur le XY problème, votre question est un bon exemple de cela) la façon la plus simple est juste de réaffectation:
Qui pourraient vous obliger à mettre en œuvre un opérateur d'affectation, mais à la suite de la règles de trois ou cinq vous devriez faire de toute façon (mais l'opérateur d'affectation n'est pas nécessaire si vous suivez la règle de zéro).
Vous pourrait également utiliser des pointeurs, si vous souhaitez explicitement à détruire l'actuel
swiss
objet:Mais des pointeurs est une boîte de pandore que vous devriez éviter, et n'ont pas vraiment besoin de beaucoup en C++ moderne. Mais les pointeurs (ou références) sont nécessaires si vous voulez polymorphisme. Alors vous pourriez avoir un pointeur sur la classe de base de pointage à l'instance réelle, et des choses comme des fonctions virtuelles fonctionnent comme prévu.
Aussi, et en fonction de votre situation dont nous ne savons encore rien sur, vous pouvez bien sûr utiliser le cadrage:
Si l'occultation des noms de variables comme cela fonctionne, c'est une mauvaise habitude que vous devriez éviter que cela ajoute de la confusion pour les lecteurs de code. D'autre part, même lors de l'utilisation des étendues rien ne vous empêche d'utiliser tout (valide) nom de la variable que vous voulez, de sorte que vous pouvez nommer l'extérieur de la portée de l'instance
jarlsberg
l'intérieur de la portée de l'instancegruyere
, legruyere
objet serait alors détruite à la fin de la portée tout comme n'importe quel autre imbriquée-portée variable serait détruite, et "disparaître".Des domaines distincts serait la meilleure, mais je tiens à promouvoir séquentielle étendues, pas imbriquée étendues:
{ Cheese swiss(1); } ... { Cheese swiss(2); }
Les suggestions utiles, je vous remercie. Suis-je donc en conclure que cette fonctionnalité n'existe pas dans la langue, comme indiqué dans l'OP? Qui est:
whack swiss;
OriginalL'auteur Some programmer dude
On peut utiliser de portée pour vous permettre de définir une autre instance d'une classe.
En règle générale déclarés localement les instances de détruire eux-mêmes quand ils passent hors de portée.
Si vous avez vraiment d'alimentation de la nécessité de détruire le fromage, alors vous avez besoin d'allouer dynamiquement de la place.
De mémoire allouée dynamiquement doit toujours être supprimé manuellement.
"la mémoire allouée Dynamiquement doit toujours être supprimés manuellement" Qui était vrai il y a vingt ans, mais maintenant que vous devriez être en utilisant des pointeurs intelligents il s'agit essentiellement d' jamais true dans le code de bonne.
J'adore votre pseudo. Je suis d'accord avec vous. Le problème est que l'op est nouveau ou qu'il ne serait pas à poser une question de ce genre. La réponse s'efforce de point de lui deux choses qu'il doit savoir au sujet de. la réponse est déjà suffisamment complexe sans l'ajout de la notion de pointeurs intelligents, ou de la gestion des exceptions nécessaires pour traiter correctement avec ce code.
Si l'OP est nouveau, alors c'est encore plus important de ne pas misteach eux, comme ils ne savent pas la différence. En outre, les pointeurs intelligents sont les facile approche que nous devrions commencer avec; laisser les rubriques avancées comme le manuel de gestion de la mémoire lorsque l'OP a un peu plus d'expérience.
Me semble que vous devriez répondre à la question.
OriginalL'auteur EvilTeach
Rares sont les cas où vous auriez besoin pour ce faire. Mais un que vous pourriez rencontrer, c'est lors de la création d'un type abstrait de données.
Par exemple, si vous réalisez une variante de type, vous aurez probablement souhaitez configurer une aligné type de données, puis manuellement placement new et delete.
Vivifier:
Pour effacer:
Cependant, comme mentionné dans l'un des nombreux autres postes. Si vous êtes à la programmation normalement, vous n'avez pas besoin de vous soucier manuellement appeler dtors. Si c'est sur la pile, puis il est nettoyé pour vous. Si c'est sur le tas puis
delete
prendra soin de cela pour vous. Le seul moment où vous voulez faire, ce est où vous êtes manuellement la prise de contrôle sur la durée de vie de l'objet, et la raison principale pourquoi vous voulez le faire est lorsque vous êtes à la mise en œuvre d'un type abstrait de données.Est-il une nomenclature qui préféré?
OriginalL'auteur OmnipotentEntity
Le Côté Sombre de C++ possède une technique pour effectuer exactement ce que tu décris dans le post original. Je ne sais pas pourquoi vous voulez faire cela, peut-être que la mise en œuvre d'un opérateur d'affectation semble fastidieux. Peut-être que vous avez un désir morbide de faire quelque chose de contre nature de votre programme. Je peux vous assurer qu'aucune personne "normale" envisagez d'utiliser le code que je vous dévoile ci-dessous, au moins pas quand les autres sont en train de regarder. Alors, pourquoi suis-je mettre cela ici?
Parce que je suis sadique.
J'en appelle à la puissance de la Communauté Wiki pour me protège contre l'attaque!
OriginalL'auteur
Si pour quelque raison vous ne pouvez pas utiliser l'opérateur d'affectation, vous pouvez utiliser un
optional
.Aussi longtemps que vous ne stockez pas l'option, vous pouvez sans doute compter sur le compilateur optimisant les extra interne bool.
OriginalL'auteur sbabbi