![](/img/trans.png)
[英]How can I call a non-static member function of a class from a static member function of another class?
[英]Why can I call a non-static function by a static pointer?
我以為我不能使用靜態指針來調用非靜態函數,因為我認為靜態指針屬於整個類,但非靜態函數屬於特定對象。 但不知何故,我成功了,不知道為什么會這樣。
這是我的代碼:
#include <cstdio>
class B
{
public:
void show(int aValue);
};
//B.cpp
void B::show(int aValue)
{
if (aValue == 100)
printf("This is the desired value");
else
printf("This is not the desired value");
}
class A
{
private:
static B* mUpdater;
public:
static int function1();
};
B* A::mUpdater = new B();
int A::function1()
{
int final = 100;
mUpdater->show(final); // mUpdater is a static pointer, show is a non-static function
return 1;
}
int main()
{
return !A::function1();
}
代碼運行,並打印“這是所需的值”。 但我有點困惑,因為我認為代碼無法運行。 這是因為我將特定對象的地址分配給指針,以便它可以工作嗎? 或者無論在哪種情況下,靜態指針只能調用非靜態函數?
任何想法都將超過贊賞。
(假設B
繼承自A
(參見你問題的評論)。)
static
成員函數意味着您不能使用類/對象的this
指針。 在A::function1()
您不使用this
-pointer。 相反,你調用一個實際實例( B
)的函數,它可能是靜態的,也可能不是靜態的。 是否通過靜態/非靜態指針/引用訪問該實例無關緊要。 因此您的使用是有效的。
但是,您的代碼非常混亂。 你的show()
函數無論如何都不使用該類的任何變量,所以它也可能是靜態的。 另外,使用指向另一個B
類對象的指針從A
的靜態成員函數調用非靜態成員函數似乎也難以置信。 你可能會在其中的一些實例的數據的情況下結束了B
當你期待的一些實例的數據被用於A
使用。
我以為我不能使用靜態指針來調用非靜態函數,因為我認為靜態指針屬於整個類,但非靜態函數屬於特定對象。
靜態成員指針屬於“整個”類,因此所有實例(或其他靜態成員函數)都可以訪問它。 但是一旦他們訪問它,他們只能訪問一個指針。
具體而言,如果指針指向同一個類的實例,那么這些函數也可以訪問該指針所指向的對象的私有成員。
如果我正確理解了這個問題,你就會問
static B* mUpdater;
具體來說,你很驚訝
mUpdater->show(final);
是合法的C ++。
重要的是要理解上面的static
關鍵字是指mUpdater
,而不是它所指向的。 也就是說,有一個指針,由所有A
共享,指向B
類的單個對象 。
當編寫mUpdater->show()
即取消引用A::mUpdater
訪問單B
對象,並調用show()
該方法B
。
您可以進一步簡化您的示例,這樣可以更輕松地從周圍的干擾中挑選您的問題:
#include <cstdio>
struct B
{
void show() {
printf("This is B::show()\n");
}
};
struct A
{
static B *worker;
static void f() {
worker->show();
}
};
B* A::worker = new B();
int main()
{
A::f();
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.