Вызывать метод класса С++ без экземпляра класса?

Можно ли вызвать метод класса 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(..) для каждого из классов без предварительного создания экземпляра класса для каждого?

Ответы

Ответ 1

Используйте ключевое слово 'static' для объявления метода:

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

Затем вы можете вызвать метод без экземпляра:

int one = 1;
int two = 2;

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

'static' - это функции, которые используют только класс как пространство имен и не требуют экземпляра.

Ответ 2

Вы можете вызвать метод класса без экземпляра, объявив его static, но это не похоже на то, что вы хотите. Вы хотите иметь возможность вызывать тот же метод на 100 различных классах.

Существует два способа для С++ различать различные методы класса. Один из них заключается в том, чтобы делать это во время компиляции, а один - во время выполнения. Во время компиляции вам нужно вызвать имя класса как часть вызова статического метода или вам нужен экземпляр объекта или указатель для определенного производного класса. Во время выполнения вы можете вызвать метод полиморфно, если вы объявили метод virtual. Обратите внимание, что вам нужен объект класса для использования любого из методов времени выполнения.

Ответ 3

Как упоминал Mark Random и Greyson, вы можете сделать этот метод статическим, а затем вызвать правую подпись без создания экземпляра объекта. Однако вы можете подумать дважды о написании своей функции таким образом, а не писать другую версию этой же функции. Вот соображения, особенно для большой программы:

  • статические методы сложны для написания модульных тестов для.
  • B/c характера статических методов, они постоянно находятся в памяти .
  • Многопоточность будет сложной, если ваша программа должна ее использовать.