如何从C++中的静态成员函数访问非静态成员

How to access a non-static member from a static member function in C++?

本文关键字:静态成员 函数 访问 C++      更新时间:2023-10-16

我写了以下代码:

class A
{
    public:
    int cnt;
    static void inc(){
        d.cnt=0;
    }
};
int main()
{
   A d;
   return 0;
}

我看到了这个问题:

如何在不传递类实例的情况下从静态成员函数调用非静态成员函数

但我不想用指针。我可以不使用指针吗?

编辑:

我看到了以下问题:

如何从java中的静态方法访问非静态成员?

为什么我不能做那样的事?

不,如果没有指向对象实例的指针,就无法从静态函数调用非静态成员函数。否则编译器怎么知道在哪个对象上调用函数呢?

正如其他人所指出的,您需要访问对象才能对其执行操作,包括访问其成员变量。

从技术上讲,您可以像下面的zeroBad()函数一样编写代码。但是,由于您无论如何都需要访问该对象,因此不妨将其作为一个成员函数,如zeroGood():

class A
{
    int count;
public:
    A() : count(42) {}
    // Zero someone else
    static void zeroBad(A& other) {
        other.count = 0;
    }
    // Zero myself
    void zeroGood() {
        count = 0;
    }
};
int main()
{
    A a;
    A::zeroBad(a); // You don't really want to do this
    a.zeroGood();  // You want this
}

更新:

您也可以在C++中实现Singleton模式。除非你有一个非常具体的原因,否则你可能不想这么做。辛格尔顿被许多人认为是一种反模式,例如因为它很难测试。如果你发现自己想要这样做,重构你的程序或重新设计可能是最好的解决方案。

如果不使用指针,就不能在静态函数中使用非静态成员变量或函数。

您本身不需要指针,但确实需要访问访问非静态变量的对象。在您的示例中,对象d对A::inc()不可见。如果d是一个全局变量,而不是main的局部变量,那么您的例子就可以了。

也就是说,很奇怪你为什么要尽一切努力避免在C++中使用指针。