2017-01-01 7 views
1

私はいくつかのクラスのメソッド/アルゴリズム/関数のどれを使用するかを指定することができるようにするプロジェクトを開発しています。それぞれのメソッド "クラス"は同様の機能を提供し、他のクラスと互換性があります。静的クラス関数を使用するような派生クラスを使用できますか?

私は、派生クラスとメソッド「クラス」をベース抽象クラスでこれを実装しようとした:

class Method { 
public: 
    virtual int function1(int) = 0; 
    virtual int function2(int, int) = 0; 
}; 

class Method1 : public Method { 
public: 
    int function1(int a) { 
     return a * 2; 
    } 

    int function2(int a, int b) { 
     return a + b; 
    } 
}; 

class Method2 : public Method { 
public: 
    int function1(int a) { 
     return a/2; 
    } 

    int function2(int a, int b) { 
     return a - b; 
    } 
}; 

void useMethod(int a, int b, Method& m) { 
    int result1 = m.function1(a); 
    int result2 = m.function2(a, b); 

    /* Do something with the results here */ 
} 

int main() { 
    // Doesn't work, "type name is not allowed" 
    useMethod(1, 2, Method1); 
    useMethod(1, 2, Method2); 

    // Works, but seems unnecessary and less elegant 
    Method1 x; 
    useMethod(1, 2, x); 
    Method2 y; 
    useMethod(1, 2, y); 

    return 0; 
} 

問題は、私はMethod1Method2を使用できるようにする方法を見つけ出すように見えることはできませんということですそれらのインスタンスを作成せずに - 私は不必要なように見える、彼らはすべて同じ機能を提供するだけなので。 派生クラスを「静的」に並べ替えるために、インスタンスなしで利用できるようにする方法はありますか?あなただけ行うことができ

+1

http://stackoverflow.com/questions/1820477/c-static-virtual-membersの可能な複製 – UnholySheep

+0

また、私は継承がここでかなり正しいアプローチだとは思わない。私はテンプレートや関数ポインタ(または 'std :: function')を使用する方が意味をなさないと思っています – UnholySheep

+0

@UnholySheep' std :: function'がより良い解決策を提供する方法について詳しく説明できますか?それは単なる関数ラッパーではありませんか? –

答えて

4

useMethod(1, 2, Method1()); 
useMethod(1, 2, Method2()); 

はそうでなければ、あなたはstatic virtualメソッドを持つことができません。

useMethod<Method1>(1, 2); 

そして、あなたはどちらかそれから基本抽象クラスを必要としないと仮想メソッドは必要ありません:

template<typename T> 
void useMethod(int a, int b) 
{ 
    int result1 = T().function1(a); //or if you made the methods static then T::method1(a) 
    int result2 = T().function2(a, b); //ditto 

    /* Do something with the results here */ 
} 

と使用方法を:あなたはしかし、テンプレートと同じようなことを達成することができました。コードコメントで述べたように、メソッドを静的にすることができ、クラスのインスタンスは必要ありません。

+0

これは、最初に変数に代入するのではなく、関数呼び出しでオブジェクトを直接作成する点を除いて、OPsの2回目の試みと本質的に同じです。 – UnholySheep

+0

@UnholySheepはい、それは「あまり優雅」ではないという証拠を意味していました。多形性を持たない代替アプローチを示すためにテンプレート版を追加しました。 – Resurrection

関連する問題