Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从C+中的静态成员函数访问非静态成员+;?_C++_Oop_Static Members - Fatal编程技术网

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

C++ 如何从C+中的静态成员函数访问非静态成员+;?,c++,oop,static-members,C++,Oop,Static Members,我编写了以下代码: class A { public: int cnt; static void inc(){ d.cnt=0; } }; int main() { A d; return 0; } 我看到这个问题: 但我不想使用指针。我可以不用指针吗 编辑: 我看到了以下问题: 为什么我不能这样做?不,如果没有指向对象实例的指针,就无法从静态函数调用非静态成员函数。否则编译器怎么知道调用函数的对象呢?不,如果没有指向对象实例的

我编写了以下代码:

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

int main()
{
   A d;
   return 0;
}
我看到这个问题:

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

编辑:

我看到了以下问题:


为什么我不能这样做?

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

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

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

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

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


你说,你为什么想去避免在C++中使用指针,这是很奇怪的。

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


这是很奇怪的,为什么你想做任何努力避免在C++中使用指针。

< P>就像其他人指出的,你需要访问一个对象,以便对它执行操作,包括访问它的成员变量。 从技术上讲,您可以编写下面我的
zeroBad()
函数之类的代码。但是,由于您无论如何都需要访问该对象,因此不妨将其作为成员函数,如
zeroGood()

更新:

也可以在C++中实现> Stutelon < /C>模式。除非你有一个非常具体的原因,否则你可能不想这么做。例如,Singleton是因为它很难测试。如果您发现自己想这样做,重构程序或重新设计可能是最好的解决方案。

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

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

更新:

也可以在C++中实现> Stutelon < /C>模式。除非你有一个非常具体的原因,否则你可能不想这么做。例如,Singleton是因为它很难测试。如果你发现自己想做这件事,重构你的程序或者重新设计可能是最好的解决方案。< /P>问题是C++,而不是C。问题是C++。不是C。这里一个更重要的问题是:你为什么要这样做?@L因为我想学习。你想访问哪种类型的A对象?你可以将它包含在

inc(param)的参数中
这里一个更重要的问题是:你为什么要这样做?@Lstor因为我想学习。你想访问哪种类型的A对象?你可以将它包含在
inc(param)
的参数中。这个有用法,这个有用法,
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
}