簡體   English   中英

錯誤當創建一個不能在堆棧上只能在堆上創建其對象的類時?

[英]Error While creating a class whose object cant be created on stack but only on Heap?

我嘗試編寫代碼來創建一個類,該類的對象只能在堆上創建,而不能在堆棧上創建。 但是在編譯期間我遇到了一些鏈接錯誤。

  # include<iostream>
  # include<stdio.h>
  # include<conio.h>

  using namespace std;

  class Rect
  { 
      int length;
      int breadth;
      Rect();

       public :
       Rect & operator = (const Rect&);       
       Rect(const Rect& abc)
       {
           cout<<"in copy const"<<"\n";        
       }

       ~Rect();
       int area_rect()          
       {
           return length*breadth;
       }

       void set_value(int a,int b);

       static Rect* instance()
       {     
           Rect* ptr=NULL;
           ptr=new Rect ;
           return ptr;
       }
   };

   void Rect::set_value(int a,int b)
   {
       length=a;
       breadth=b;
   }

   int main()
   {

       Rect* a= Rect::instance();
       a->set_value(10,3);
       cout << "area realted to object a : "  << a->area_rect() <<"\n"; 
       Rect* b=a;    
       b->set_value(10,4);
       cout << "area realted to object a : "  << a->area_rect() <<"\n"; 
       cout << "area realted to object b : "  << b->area_rect() <<"\n"; 
       delete b;
       getch();
       return 0;
   }       

我收到以下錯誤:

ccUfbaaa.o(.text+0x24f) In function `main':   [Linker error] undefined reference to `Rect::~Rect()' 
ccUfbaaa.o(.text$_ZN4Rect8instanceEv[Rect::instance()]+0x60) In function `ZN4Rect9area_rectEv':   [Linker error] undefined reference to `Rect::Rect()' 
ccUfbaaa.o(.text$_ZN4Rect8instanceEv[Rect::instance()]+0x60) ld returned 1 exit status .

我知道我可以將析構函數設為私有,這將允許僅在堆上創建對象。 但是在那種情況下,如何刪除創建的對象? 我們如何糾正上述錯誤?

您只需要在某個地方實現默認的構造函數和析構函數即可:

Rect::Rect():length(0),breadth(0) {};
Rect::~Rect() {};

然后公開Rect::instance()Rect::set_value(int, int)Rect::area_rect()會有所幫助

強制您的類型只能放在堆上而不能放在堆上的方法是,使用具有純虛擬析構函數基的基類,並將析構函數設為私有:由於析構函數不可用於整個對象,它不能放在堆棧上,但是可以通過指向基址的指針刪除。 為了防止將派生類放到堆棧上(如果也應避免這種情況),您需要將類型設置為final (盡管僅在C ++ 2011中可用):

struct A { virtual ~A() = 0; };
A::~A() {}

struct B final: A { private: ~B() {} };

int main()
{
    //B  berror; // ERROR: destructor not accessible
    B* b = new B;
    delete static_cast<A*>(b);
}

您的某些成員已被聲明但未定義的事實已在此問題的其他答案中提及。

暫無
暫無

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

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