2

我想知道为什么不能从静态函数调用成员函数

#include <iostream>

class A{
public:
  A(){}
  ~A(){}
  static void astaticFunction(){
    printHello();
  }

private:
  void printHello(){
    std::cout << "Hello" << std::endl;
  }

};

int main(int argc, char **argv){
  A::astaticFunction();
  return 0;

}

编译器正在返回这个

main.cpp: In static member function ‘static void A::astaticFunction()’:
main.cpp:8:16: error: cannot call member function ‘void A::printHello()’ without object

我该如何使用它?谢谢

4

2 回答 2

10

您只能从静态成员函数内部调用其他静态成员函数。这是因为非静态成员函数与对象的特定实例相关联。这里没有实例。

所以一个快速的解决方法是使printHello静态:

static void printHello(){
  std::cout << "Hello" << std::endl;
}

如果您需要 printHello处理的特定实例A(因为可能在您的真实代码中它使用非静态数据成员),那么您需要创建该实例。你可以这样做:

static void astaticFunction(){
  A a; // Create an A object
  a.printHello();
}
于 2013-03-28T16:51:03.157 回答
0

正如 sftrabbit 所说,您不能从静态成员函数访问非静态成员。正如解释为什么,使用隐式传递this (实例指针)的调用约定来调用非静态成员函数。所以当你调用它们时,除了定义的参数之外,还有一个隐藏的这个参数。

于 2013-03-28T16:59:28.813 回答