在没有类实例的情况下调用c ++类方法?

时间:2012-05-04 03:42:44

标签: c++

是否可以在不先创建类实例的情况下调用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 个答案:

答案 0 :(得分:39)

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

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

然后你可以在没有像这样的实例的情况下调用方法:

int one = 1;
int two = 2;

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

'static'方法是仅将类用作命名空间的函数,不需要实例。

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

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

  • 静态方法难以编写单元测试
  • B / c静态方法的性质,它们一直驻留在记忆
  • 如果您的程序需要使用多线程,那么多线程就很难。

答案 3 :(得分:0)

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