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];
}

ご覧のとおり、上記の例では、両方のクラスに内部変数がなく、ダミーのコンストラクタ/デストラクタを使用しています。それらの唯一の目的は、1つのパブリックメソッドを公開することですMyMethod(..)。私の質問は次のとおりです。ファイルにそのようなクラスが100個あると仮定します(すべてクラス名は異なりますが、構造は同じです。1つのパブリックメソッドが同じプロトタイプを持っています) 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++ で異なるクラス メソッドを区別する方法は 2 つあります。1 つはコンパイル時に実行する方法で、もう 1 つは実行時に実行する方法です。コンパイル時に、静的メソッドの呼び出しの一部としてクラス名自体を呼び出す必要があるか、特定の派生クラスへのオブジェクト インスタンスまたはポインターが必要です。メソッドを virtual と宣言した場合、実行時にメソッドをポリモーフィックに呼び出すことができます。いずれかの実行時メソッドを使用するには、クラスのオブジェクトが必要であることに注意してください。

于 2012-05-04T03:56:14.243 に答える
2

Mark RandomとGreysonが述べたように、そのメソッドを静的にして、オブジェクトをインスタンス化せずに適切な署名を呼び出すことができます。ただし、同じ関数の別のバージョンを作成するのではなく、この方法で関数を作成することについてよく考えてみてください。特に大規模なプログラムの場合の考慮事項は次のとおりです。

  • 静的メソッドは、の単体テストを作成するのが困難です
  • 静的メソッドの性質のB/c、それらは常にメモリに存在します。
  • プログラムでマルチスレッドを利用する必要がある場合、マルチスレッドは困難になります。
于 2012-05-04T04:21:28.940 に答える
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;
}

ウッバ・ルバ・ダブダブ!

于 2021-09-01T12:21:34.730 に答える