我以为我不能使用静态指针来调用非静态函数,因为我认为静态指针属于整个类,但非静态函数属于特定对象。但不知怎的,我让它成功了,我不确定为什么会这样。
这是我的代码:
#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();
}
代码运行,并打印&#34;这是所需的值&#34;。但我有点困惑,因为我认为代码无法运行。这是因为我将特定对象的地址分配给指针,以便它可以工作吗?或者无论在哪种情况下,静态指针只能调用非静态函数?
任何想法都将得到更多的赞赏。
答案 0 :(得分:2)
(我们假设B
继承自A
(请参阅对您问题的评论)。)
static
成员函数意味着您不能使用类/对象的this
指针。在A::function1()
中,您不使用this
- 指针。而是调用实际实例(B
)的函数,该函数可能是静态的,也可能不是静态的。是否通过静态/非静态指针/引用访问该实例无关紧要。因此您的使用是有效的。
但是,您的代码非常混乱。您的show()
函数无论如何都不使用该类的任何变量,因此它也可能是静态的。使用指向B
类型的另一个对象的指针从A
的静态成员函数调用非静态成员函数似乎也难以置信。当您期望使用某些B
实例的数据时,您可能会遇到使用某些A
实例的数据的情况。
答案 1 :(得分:1)
我以为我不能使用静态指针来调用非静态函数,因为我认为静态指针属于整个类,但非静态函数属于特定对象。
静态成员指针属于&#34;整体&#34; class,所以所有实例(或其他静态成员函数)都可以访问它。但是一旦他们访问它,他们只能访问指针。
具体而言,如果指针指向同一个类的实例,那么这些函数也可以访问该指针所指向的对象的私有成员。
答案 2 :(得分:0)
如果我正确理解了这个问题,那你就是在询问
static B* mUpdater;
具体来说,你很惊讶
mUpdater->show(final);
是合法的C ++。
重要的是要理解上面的static
关键字指的是mUpdater
,而不是指的是A
。也就是说,有一个指针,由所有B
共享,指向类mUpdater->show()
的单个对象。
当您撰写A::mUpdater
时,会取消引用B
以访问单个show()
对象,并调用该B
的{{1}}方法。
您可以进一步简化您的示例,这样可以更轻松地从周围的干扰中挑选出您的问题:
#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;
}