让:
class CLASS{
void foo() {};
static void staticFoo() { foo(); }
};
为什么从静态方法调用非静态方法会有问题?我该如何解决?
答案 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
类的名称。请注意,就像在现实世界中一样,我们不仅要命名动物的抽象概念,我们还要命名自己的宠物或某些已知的特定动物,而这些动物恰巧是一种动物。这可能会受到批评,但您可以将其视为dog
和the dog
之间的区别。后者是所有参与方都知道的特定dog
。这就是方法set_name
和get_name
需要知道您在说什么动物的原因。
考虑一下:
Animal my_dog;
my_dog.set_name("stripes");
Animal my_cat;
my_cat.set_name("katz");
方法set_name
更新my_dog
和my_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
是非静态成员函数。非静态成员函数不能被静态调用。
...如果调用是通过静态函数进行的?
从何处调用函数对是否可以静态调用没有影响。