2017-01-12 5 views
1

私はシングルトンパターンでクラスを実装し、そのクラスのインスタンスにプライベートメンバ関数を呼び出したいと思っています。クラスの静的インスタンスはプライベートメンバ関数を呼び出すことができません。 C++

#include <iostream> 
using namespace std; 

class Test { 
private: 
    Test(){} 
    static Test* getInstance() 
    { 
     static Test obj; 
     return &obj; 
    } 
public: 
    void print() 
    { 
     cout<<"test function"<<endl; 
    } 


}; 


int main(int argc, const char * argv[]) { 
    Test::getInstance()->print(); //error! 
    return 0; 
} 

と私は静的インスタンスは、プライベートメンバ関数を呼び出すことができると思うのエラーメッセージフォームのXcodeの

'print' is a private member of 'Test'

を取得します。

申し訳ありませんが、私はここで間違ったコードを書いています。上記補正されたコードが実際のコードである

#include <iostream> 
using namespace std; 

class Test { 
private: 
    Test(){} 
    void print() 
    { 
     cout<<"test function"<<endl; 
    } 
public: 
    static Test* getInstance() 
    { 
     static Test obj; 
     return &obj; 
    } 
}; 

int main(int argc, const char * argv[]) { 
    Test::getInstance()->print(); 
    return 0; 
} 

:以下に示すようgetInstance()は、公開しなければなりません。

+3

古いコンパイラを使用している可能性があります。いいえ、エラーは 'Test :: getInstance()'からです。これはプライベートメンバー関数です。したがって、クラススコープ外ではアクセスできません。 – WhiZTiM

+3

楽しい事実:シングルトンは、その作者によって*タールされ、羽ばたく*。 –

+0

引用した実際のエラーメッセージが出たときにコンパイルしたコードですか? –

答えて

2

GetInstanceはテストのプライベート関数なので、クラス外からはアクセスできません。getInstanceをpublicにする必要があります。

関数が静的であるという事実は、オブジェクトの一部である他のコードからしかアクセスできますが、関数にアクセスする必要がないことを意味します。

なぜ静的なプライベート関数があるのですか?そのような使用は、関数が静的なものではなくメンバ関数である場合、自由でない変数 'this'を暗黙的に受け取るように、最適化の一部とみなすことができます。

EDIT: コードを修正したため、プライベート関数はメンバであるクラスからのみ呼び出すことができるため、印刷機能をパブリックにする必要があります。インスタンスがある場合は問題ありませんしかし、そのクラスの静的クラスから呼び出すことができます(GetInstから呼び出すことはできますが、Mainから呼び出すことはできません)。

0

アクセス制御は、アクセスしているコンテキストを扱いますからになります。クラスのプライベートメンバーにアクセスしています。ただし、クラスメンバーのアクセス式(Test::getInstance()->print())はmain関数内にあります。この関数には、プライベートメンバーにアクセスする特別な権限はありません。したがって、この式は、表示されるコンテキスト内からオブジェクトのプライベートメンバーにアクセスできないことを意味します。

関連する問題