[英]How to access private static variable in static member function of another class?
[英]How static function is accessing private member function(constructor) of a class
我遇到了如下代碼,它基本上是 singleton class 的示例,其中我們將 class 構造函數設為私有,並提供一個 static 公共 function 以在需要時創建 class 的實例。
我的問題是,當我們調用new
運算符在static function內部創建一個singleton class的object時,那么class的構造函數肯定會被調用。 我很困惑它是如何發生的,因為據我所知,static function 只能訪問 static 成員和 class 的 static 函數那么它如何訪問私有 function(即本例中的 818 構造函數 39)?
static function 可以在不創建任何實例的情況下調用 class 的任何私人或公共成員 function 嗎?
#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.
如果我們可以訪問 class 的私有 function 和 static 公共 function 那么為什么我會收到此錯誤?
static function 可以在不創建任何實例的情況下調用 class 的任何私人或公共成員 function 嗎?
您正在創建一個實例。
instance = new Singleton();
new
關鍵字創建Singleton
object。
而且,是的,因為Singleton::getInstance
是 class 的成員 function,所以它能夠調用構造函數(盡管請注意,您只是間接地這樣做),無論它是否為static
。
上述代碼之所以有效,是因為getInstance()
的實現調用了不需要 object 實例的構造函數。
Static 成員函數屬於 class 而不是 object。因此,當調用 static 成員 function 時,沒有 object 的實例,您無法訪問this
指針,因為沒有。 如果要從 static function 訪問非靜態私有成員函數,則需要將 object 的引用傳遞給 function。例如
例如
class foo {
public:
foo(int i) : myInt(i) {}
static int myStaticMethod(foo & obj);
private:
int myInt;
};
int foo::myStaticMethod(foo & obj) {
return obj.myInt;
}
#include <iostream>
int main() {
foo f(1);
std::cout << foo::myStaticMethod(f);
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;
Sample s;
s.testFunc(); // this is OK, there is an object (s) and we call
// testFunc upon s
// testFunc(); // this is not OK, there is no object
}
void InstanceFunction()
{
std::cout << "Inside public instance function" << std::endl;
testFunc();
}
};
int main()
{
Sample s;
s.InstanceFunction();
Sample::statFunc();
return 0;
}
調用testFunc();
從statFunc
內部無法完成,因為testFunc
(私有或非私有)是一個實例function,你需要一個testFunc
可以操作的Sample
object,但statFunc
是一個static
function,因此沒有Sample
object。
錯誤消息對此非常清楚。
僅當您提供 object 時,才能從statFunc
調用testFunc
,請參見上面的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.