2011-12-21 18 views
1

私は、他のすべてのクラスインスタンスが使用する変数を持つシングルトンクラスを持っています。 今、私はシングルトンクラスに関数 "GetReference"を入れたいと思います。constポインタ参照を返します

  1. 変数への参照を返すことはできますか?もしそうなら、どのように変数への参照を返すことができますか?
  2. 他の人にのみ変数を使用させ、変数を変更または削除させないようにするにはどうすればいいですか?私の場合はconstが使えますか?

答えて

2

1)構文この種の使用、変数に参照を返すために:CONST REF(すなわち、変更または削除することができなくなり)、使用を返すに

int& getARefOnDummy() 
{ 
    return dummy; 
} 

2)この種の構文:

0

修飾子constが役に立ちます。次の例では、インスタンス/静的変数xはgetReferenceを呼び出すものでは変更できません。

const int& Singleton::getReference() const 
{ 
    return x; 
} 
0

厳密に言うと、const修飾子はキャストアウトされ、変数が変更されます。値による返り値は、内部変数への参照よりも安全で優れた選択です。

戻り値が高価な場合(たとえば、大きなクラスのオブジェクトが返された場合)、簡単なラッパークラスと実装に対するプライベートリファレンスで委譲パターンを使用できます。

0

参照を返すことはできますが、オブジェクトが静的であるかオブジェクトの一部である(つまりローカル変数がない)場合に限ります。あなたは、クラスのオブジェクトへの参照を返すことができ

class Singleton 
{ 
private: 
    static Singleton *singleton = 0; 
    Singleton() // making the constructor private keeps others from creating their own instance 
    { 
    } 

    ~Singleton() // making the destructor private keeps others from destroying their instance on their own 
    { 
    } 
public: 
    static Singleton *GetPtr(void) 
    { 
     if(!singleton) 
      singleton = new Singleton(); 
     return singleton; 
    } 

    static Singleton &GetRef(void) 
    { 
     return *GetPtr(); // dereference the pointer 
    } 

    static void Free(void) 
    { 
     if(!singleton) 
      return; 
     delete singleton; 
     singleton = 0; 
    } 
} 

あなたにも私のように(あなたがあなたのクラスに何をしたいかに応じて、constのポインタおよび/または参照を返すことができます他人に削除や変更をさせたくないかどうかわかりません)。これを騙す方法があることに留意してください(const_cast<>())。

0
#include <stdio.h> 
using namespace std; 
//This is the class, which I want to keep others to delete or modify 
class Ref{ 
public: 
    int X; 
}; 


class SingleTon{ 

private: 
    static Ref reference; 
public: 
    SingleTon(){ 
    // reference = new Ref(); 
    } 
    static const Ref& getReference(){return reference;} 
}; 

int main(){ 
    Ref * ptr = SingleTon::getReference(); 
} 

私はシングルトン:: getReference()を言うなら誰もが内容だけを変更したり、ポインタを削除するには、それを使用しますが、ないように、私は、クラスのRefのrefernceを取得する必要があります。

関連する問題