2012-02-07 12 views
1

クラスを作成するコードを作成しようとしましたが、そのオブジェクトはヒープ上にしか作成できませんが、 スタックは作成できません。しかし、コンパイル中にいくつかのリンクエラーが発生しました。エラースタック上にオブジェクトを作成することはできませんが、ヒープ上にのみ作成できるクラスを作成する際には、

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 . 

私はオブジェクトだけヒープ上にcratedできるようになりますデストラクタのプライベートを作ることができます知っている:

# 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; 
    }  

は、私は次のエラーを得ました。しかし、その場合、どのように私は作成されたオブジェクトを削除できますか?そして、上記のエラーをどうやって修正することができますか?

+2

〜Rect()の実装がなく、デフォルトコンストラクタがありません。 –

答えて

3

あなただけのデフォルトコンストラクタとどこかデストラクタを実装する必要があります:あなたはあなたのタイプができることを強制することができます

+0

代入を行うのではなく、イニシャライザリストを使用します。 –

+1

@ kerrek-sbが編集しました – jgsogo

+1

(セミコロンは必要ありません:-)) –

1

道を助ける、公共Rect::instance()Rect::set_value(int, int)Rect::area_rect()を作り、

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

、その後に純粋な仮想デストラクタベースを持つ基本クラスを持ち、デストラクタをプライベートにする:デストラクタは完全なオブジェクトにアクセスできないため、ヒープに置くことはできません。スタックへのポインタを介して削除することができます。 (ただし、C++ 2011でのみ利用可能です)あなたがタイプfinalを作りたい(あまりにも、これを防止する必要がある場合)派生クラスがスタックに置くことができないようにするには:

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

事実をあなたのメンバーのいくつかは宣言されていましたが、定義されていませんでした。

関連する問題