簡體   English   中英

C ++默認構造函數,用新對象初始化指針

[英]C++ default constructor, initializing pointer with new object

我有以下問題:在myClass中我想默認初始化一個指向yourClass的指針,帶有一個新的yourClass地址。 不幸的是,如果我想在任何一點刪除指針,我得到一個(核心轉儲)。

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的print()應該產生兩種不同的打印,取決於//參數。

我認為你的等級是yc; 而不是yourClass * yc,但我想知道它是否可行。

編輯:我以下面的方式重新編寫代碼,它的工作原理。 仍然看起來很復雜,聰明的指針看起來很有希望,我仍然沒有應用“三個規則”。 這里的代碼。 謝謝大家。

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(); }
};

那是因為你試圖刪除太多:

  • 您正在刪除第二個構造函數中的未分配對象(刪除delete yc;
  • 您正在嘗試刪除堆棧分配的對象,b。 delete a; 將嘗試刪除指向b的指針,b是堆棧中的對象; 會發生什么取決於您的操作系統(我期待異常/核心轉儲/無論如何)

編輯:我發現的另一個問題.. a->setMyClass(NULL)

我會建議:

你違反了三條規則。

什么是三法則?

這也是災難的秘訣:

 myClass(yourClass * tyc ) { delete yc; yc = tyc; }

如果tyc==yc會怎么樣? 對。 不漂亮 :)

 myClass(yourClass * tyc ) { if (yc!=tyc) { delete yc; yc = tyc; } }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM