37

c++是否可以在不首先创建类实例的情况下调用类方法?

假设我们有以下代码:

// just an example 
#include <iostream>
using namespace std;

class MyClass {
    public:
        MyClass();
        ~MyClass();
        int MyMethod(int *a, int *b);
};

// just a dummy method
int MyClass::MyMethod(int *a, int *b){;
    return a[0] - b[0];
}

这是另一个例子:

#include <iostream>
using namespace std;

class MyClassAnother {
    public:
        MyClassAnother();
        ~MyClassAnother();
        int MyMethod(int *a, int *b);
};

// just a dummy method
int MyClassAnother::MyMethod(int *a, int *b){;
    return a[0] + b[0];
}

正如我们所看到的,在上面的例子中,两个类都没有内部变量,并且使用了伪构造函数/析构函数;他们的唯一目的是公开一种公共方法MyMethod(..). 这是我的问题:假设文件中有 100 个这样的类(全部具有不同的类名,但具有相同的结构——一个公共方法具有相同的原型—— MyMethod(..)

有没有一种方法可以调用每个类的MyMethod(..)方法调用,而无需先为每个类创建一个类实例?

4

5 回答 5

61

使用关键字'static'来声明方法:

static int MyMethod( int * a, int * b );

然后您可以在没有实例的情况下调用该方法,如下所示:

int one = 1;
int two = 2;

MyClass::MyMethod( &two, &one );

“静态”方法是仅将类用作命名空间的函数,不需要实例。

于 2012-05-04T03:47:36.103 回答
5

您可以通过声明它来调用没有实例的类方法static,但这似乎不是您想要的。您希望能够在 100 个不同的类上调用相同的方法。

C++ 有两种方法可以区分不同的类方法。一种是在编译时执行,一种是在运行时执行。在编译时,您需要调用类名本身作为对静态方法的调用的一部分,或者您需要对象实例或指向特定派生类的指针。如果您已将方法声明为虚拟方法,则在运行时您可以多态地调用方法。请注意,您需要该类的一个对象才能使用任一运行时方法。

于 2012-05-04T03:56:14.243 回答
2

正如 Mark Random 和 Greyson 所提到的,您可以将该方法设为静态,然后在不实例化对象的情况下调用正确的签名。但是,您可能需要三思而后行以这种方式编写函数,而不是编写同一函数的不同版本。以下是注意事项,尤其是对于大型程序:

  • 静态方法很难为.
  • 静态方法的本质是 B/c,它们一直驻留在内存
  • 如果您的程序需要使用多线程,那么它会很困难。
于 2012-05-04T04:21:28.940 回答
1

我不知道为什么没有其他人提到这一点,但从你评论中描述的功能来看,听起来你想要的是一个命名空间,而不是一个类。在 100 个不同命名的命名空间中定义 100 个同名函数对您来说非常好。它的行为应该与您所描述的完全一样,并且是命名空间背后的全部目的。

于 2021-04-05T20:53:45.350 回答
1

是的。您绝对不应该在生产代码中这样做,但在这种情况下,您可以使用空指针调用类方法,它会起作用。从技术上讲,您不会创建类实例。

#include <iostream>
using namespace std;

class MyClass {
    public:
        MyClass();
        ~MyClass();
        int MyMethod(int *a, int *b);
};

// just a dummy method
int MyClass::MyMethod(int *a, int *b){;
    return a[0] - b[0];
}

int main() {
    MyClass *myClass = nullptr;
    int a = 1;
    int b = 2;
    std::cout << res = myClass->MyMethod(&a, &b) << std::endl;
}

Wubba Lubba 配音!

于 2021-09-01T12:21:34.730 回答