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

时间:2013-06-30 04:33:28

标签: c++ oop static-members

我写了以下代码:

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

int main()
{
   A d;
   return 0;
}

我见过这个问题:

How to call a non static member function from a static member function without passing class instance

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

编辑:

我见过以下问题:

how to access a non static member from a static method in java?

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

4 个答案:

答案 0 :(得分:4)

不,没有指向对象实例的指针,就无法从静态函数调用非静态成员函数。编译器如何知道调用该函数的对象是什么?

答案 1 :(得分:3)

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

您可以在技术上编写类似我的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模式。除非你有一个非常具体的原因,否则你可能不想这样做。 Singleton是considered an anti-pattern by many,例如因为它很难测试。如果您发现自己想要这样做,重构您的程序或重新设计可能是最好的解决方案。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

您本身不需要指针,但执行需要访问您通过其访问非静态变量的对象。在您的示例中,对象d对A :: inc()不可见。如果d是全局变量而不是main的局部变量,那么您的示例将起作用。

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