1

我写了以下代码:

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

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

我看过这个问题:

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

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

编辑:

我看到了以下问题:

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

为什么我不能这样做?

4

4 回答 4

4

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

于 2013-06-30T04:34:42.973 回答
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
}

更新:

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

于 2013-06-30T04:53:44.653 回答
1

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

话虽如此,但很奇怪为什么您要竭尽全力避免在 C++ 中使用指针。

于 2013-06-30T04:42:40.787 回答
1

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

于 2013-06-30T04:36:16.353 回答