Aşağıdaki sorunla karşılaşıyorum: myClass içinde bir işaretçiyi, yeni bir ClassClass adresinizle kendi Class'ınıza varsayılan olarak başlatmak istiyorum. Maalesef, işaretçiyi herhangi bir noktada silmek istersem, (çekirdek dökümü) alıyorum.C++ varsayılan kurucu, yeni nesneyle başlatıcı başlatılıyor
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;
}
a (a) baskısı, // parametrelere bağlı olarak iki farklı baskıyla sonuçlanmalıdır.
Sınıfınızı; yourClass * yc yerine, ancak mümkün olup olmadığını bilmek istiyorum.
DÜZENLEME: Kodu aşağıdaki şekilde çalıştırdım ve çalışıyor. Hala karmaşık görünüyor, akıllı işaretçiler umut verici görünüyor ve hala "Üç Kuralı" uygulanmadı. İşte kod. Hepinize teşekkürler. Çok fazla silmeye çalışıyorsunuz çünkü var
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(); }
};
Bu mümkün olmalıdır - Sınıfınızın yıkıcısı ne içerir? – 1615903
Oh ve parametreli kurucuda yc'nin silinmesi gerektiğini sanmıyorum. – 1615903