【问题标题】:How to access a non-static member from a static member function in C++?如何从 C++ 中的静态成员函数访问非静态成员?
【发布时间】:2013-06-30 04:33:27
【问题描述】:

我写了以下代码:

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?

为什么我不能这样做?

【问题讨论】:

  • 这里一个更重要的问题是:你为什么要这样做?
  • @Lstor 因为我想学习。
  • 你想访问哪个A类型的对象?
  • 你可以将它包含在inc(param)的参数中

标签: c++ oop static-members


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    【解决方案3】:

    您不能在不使用指针的情况下在静态函数中使用非静态成员变量或函数。

    【讨论】:

      【解决方案4】:

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

      也就是说,奇怪的是您为什么要努力避免在 C++ 中使用指针。

      【讨论】:

      • 问题是关于 C++,而不是 C。
      猜你喜欢
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      • 2014-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多