为什么不能从静态方法中调用非静态方法?

时间:2019-04-27 00:14:51

标签: c++

让:

class CLASS{
    void foo() {};
    static void staticFoo() { foo(); }
};

为什么从静态方法调用非静态方法会有问题?我该如何解决?

2 个答案:

答案 0 :(得分:2)

从您的问题来看,您似乎不太熟悉面向对象的编程。编写C ++类并且不了解面向对象的编程并不是最好的主意。这也不是我们可以在StackOverflow答案中总结的内容。最好搜索此主题并至少了解基础知识,然后再继续。实际上,您可以花更少的时间来熟悉这些基础知识。

这个MIT类有关面向对象编程的演示非常不错。 Object oriented programming in C++

但是要回答您的问题:为什么我们不能从静态方法中调用非静态方法。好吧,当您定义C ++类时,您是在描述模型或制作某物实例的蓝图。例如,您可以这样定义一个类Animal

class Animal {
public:
  void set_name(std::string name) { this->name_ = name; }
  const std::string& get_name() const { return this->name_; }

private:
  std::string name_;
};

显然,我们有一些方法可以设置和获取此Animal类的名称。请注意,就像在现实世界中一样,我们不仅要命名动物的抽象概念,我们还要命名自己的宠物或某些已知的特定动物,而这些动物恰巧是一种动物。这可能会受到批评,但您可以将其视为dogthe dog之间的区别。后者是所有参与方都知道的特定dog。这就是方法set_nameget_name需要知道您在说什么动物的原因。

考虑一下:

Animal my_dog;
my_dog.set_name("stripes");

Animal my_cat;
my_cat.set_name("katz");

方法set_name更新my_dogmy_cat的名称。我们必须告诉set_name我们正在谈论哪个实例。诸如此类的方法是实例方法,您可以拥有一个指向自己的指针,该指针在C ++中由this指定。这样便可以更新有关不同实例的属性。静态方法不会接收此上下文,因此除非能够访问这些实例之一,否则它将无法调用实例方法。例如:

static void print_animal(const Animal& animal) {
  std::cout << animal.get_name() << std::endl;
}

所有这些之后,希望我们为什么不能只打电话给Animal::set_name

答案 1 :(得分:-1)

  

为什么不能从静态方法中调用非静态方法?

可以从静态成员函数中调用非静态成员函数

  

为什么从静态方法中调用非静态方法会引起问题?

这不是问题。问题是您尚未在对象上调用非静态成员函数。如果没有对象参数,则不能调用非静态成员函数。

调用非静态成员函数的语法如下:

instance.mem_fun(arguments);
pointer->mem_fun(arguments);

非静态成员函数的特殊之处在于,它们可以调用其他非静态成员函数而无需显式实例参数。该参数隐式为this。静态成员函数没有this,并且异常不适用于它们。

  

我该如何解决?

使用上面显示的语法之一。您需要考虑打算将哪个实例用作非静态成员函数的对象参数。

  

但是为什么不能foo被静态调用...

因为foo静态成员函数。非静态成员函数不能被静态调用。

  

...如果调用是通过静态函数进行的?

从何处调用函数对是否可以静态调用没有影响。