以下のようなコードに出くわしました。これは基本的に、クラス コンストラクターをプライベートにし、必要に応じてクラスのインスタンスを作成する 1 つの静的パブリック関数を提供するシングルトン クラスの例です。
私の質問は、new
演算子を呼び出して静的関数内にシングルトン クラスのオブジェクトを作成すると、クラスのコンストラクターが確実に呼び出されるということです。私が知る限り、静的関数はクラスの静的メンバーと静的関数にしかアクセスできないため、それがどのように起こるか混乱しています。では、クラスのプライベート関数 (コンストラクター) にアクセスするにはどうすればよいでしょうか?
静的関数は、インスタンスを作成せずに、クラスのプライベートまたはパブリック メンバー関数を呼び出すことができますか?
#include <iostream>
using namespace std;
class Singleton
{
public:
static Singleton *getInstance();
private:
Singleton(){}
static Singleton* instance;
};
Singleton* Singleton::instance = 0;
Singleton* Singleton::getInstance()
{
if(!instance) {
instance = new Singleton(); //private ctor will be called
cout << "getInstance(): First instance\n";
return instance;
}
else {
cout << "getInstance(): previous instance\n";
return instance;
}
}
int main()
{
Singleton *s1 = Singleton::getInstance();
Singleton *s2 = Singleton::getInstance();
return 0;
}
しかし、以下のようにサンプルコードを書いたとき:
class Sample
{
private:
void testFunc()
{
std::cout << "Inside private function" <<std::endl;
}
public:
static void statFunc()
{
std::cout << "Inside static function" <<std::endl;
testFunc();
}
};
int main()
{
Sample::statFunc();
return 0;
}
g++ でコンパイル エラーが発生します。
file.cpp: In static member function ‘static void Sample::statFunc()’:
file.cpp:61: error: cannot call member function ‘void Sample::testFunc()’ without object.
静的パブリック関数を使用してクラスのプライベート関数にアクセスできる場合、なぜこのエラーが発生するのですか?