C++ constructeur par défaut, l'initialisation pointeur de souris avec le nouvel objet
J'ai le problème suivant:
Dans maclasse je tiens à défaut d'initialiser un pointeur à yourClass, avec une nouvelle yourClass adresse.
Malheureusement, si je veux supprimer le pointeur sur n'importe quel point je reçois un (core dump).
class myClass
{
protected:
yourClass * yc;
public:
myClass() { yc = new yourClass(); }
myClass(yourClass * tyc ) { delete yc; yc = tyc; }
~myClass() { delete yc; yc = NULL; }
void setMyClass (yourClass * tyc) { delete yc; yc = tyc; }
void print () { yc->print(); }
};
int main()
{
yourClass b (//parameter);
myClass * a = new myClass();
a->print();
a->setMyClass(&b)
a->print();
delete a;
return 0;
}
Le print() de a, devrait se traduire dans deux épreuves différentes, dépendantes //paramètres.
J'ai considéré yourClass yc; au lieu d'un yourClass* yc, mais je veux savoir si c'est possible.
EDIT:
J'ai retravaillé le code de la manière suivante, et cela fonctionne. A toujours l'air compliqué, pointeurs intelligents semblent prometteuses et je n'ai toujours pas appliquer la "Règle de Trois".
Ici le code. Merci à tous.
class myClass
{
protected:
yourClass * yc;
bool dynamic;
public:
myClass() { dynamic = true; yc = new yourClass (); }
myClass (yourClass * tyc )
{
//dynamic init (like default)
if (tyc == NULL ) { dynamic = true; yc = new yourClass (); }
//static use of yc
else { dynamic = false; yc = tyc; }
}
//because only if dynamic is true, we need to erase
~blu () { if (dynamic) { delete yc; dynamic = false; } }
void setMyClass(yourClass* tyc)
{
//leaving unchanged if new-stuff is NULL or like old-stuff
if ( tyc == yc || tyc == NULL ) return;
else //treating dynamic and static differently
{
if (dynamic) //if flag is set, must be deleted
{
delete yc; yc = tyc; dynamic = false;
}
else //must not be deleted, dynamic is still false
{
yc = tyc;
}
}
}
void print () { yc->print(); }
};
- Cela devrait être possible - ce qui fait le destructeur de yourClass contenir?
- Oh, et je ne pense pas qu'il devrait y avoir supprimer yc dans le constructeur paramétré.
Vous devez vous connecter pour publier un commentaire.
C'est parce que vous tentez de supprimer trop:
delete yc;
)delete a;
vais essayer de supprimer un pointeur vers b, qui est un objet sur la pile; ce qui se passe dépend de votre OS (je m'attends à une exception/core/whatever)EDIT: un autre problème, j'ai repéré..
a->setMyClass(NULL)
Je dirais:
Vous êtes à la violation de la règle de trois.
Quelle est La Règle de Trois?
Aussi c'est une recette pour un désastre:
Ce qui se passe si
tyc==yc
? La droite. Pas assez 🙂