繁体   English   中英

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

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

我写了以下代码:

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模式。 除非您有非常具体的原因,否则您可能不想这样做。 例如,由于很难测试,因此Singleton被许多人视为反模式 如果您发现自己想要这样做,则重构程序或重新设计可能是最好的解决方案。

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

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

就是说,很好奇为什么您要花大力气避免在C ++中使用指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM