0

私は一連の C++ クラスを持っていますが、それらはすべて機能的に同一である必要がありますが、それ以外は継承によって関連付けられていません。事実上、これらのクラスは名前のみが異なります。(これらのクラスはスローされ、いくつかの基本クラスの catch 句がスローされた派生オブジェクトをむさぼり食うのは望ましくありません。派生クラスは存在しますが、常に分離されているスローされたクラスの個別のセットを作成したいと考えています。 catch ブロックが関係します。)

もちろん、これの欠点はソース コードの複製です。何かを変更する必要があるたびに、同じコードの N 個のコピーを更新する必要はありません。

#define を使用して、コードの重複の問題を解決しました。しかし、代わりにテンプレートを活用できれば、デバッグ機能が向上すると思います。テンプレートでパラメーター化されるのは、クラス名自体だけです。

次のことを試みましたが、gcc では機能しませんでした (c++0x サポートが有効になっている場合):

template<typename ClassName>
class ClassName
{
  public:
    ClassName(int foo, float bar) { ... }
   ~ClassName() { ... }

   bool SomePublicMethod() { ... }

  private:
    ...
}

次に、実際のクラスを次のようなもので宣言します。

typedef ClassName<UnrelatedClass1> UnrelatedClass1;
typedef ClassName<UnrelatedClass2> UnrelatedClass2;

上記が機能しないことは既に知っています。私が達成したいことの概念的な例としてこれを提供していますが、現在使用している #define マクロ メソッド (デバッグ能力の低下に悩まされている) 以外に、それを機能させる方法があるかどうか疑問に思っています。 )

4

3 に答える 3

0

継承を使用する必要があるという他の人たちの意見に同意します。多くの目的に最適です (そのうちの 1 つは、同様のクラスが必要な理由です)。オブジェクトが関連している場合にのみ派生クラスを記述することは必須ではありません。似たようなコードをまとめることを目的としているため、機能が一致しているだけでも素晴らしいことです。

ただし、クエリは複数のクラスの作成に関するものであり、プロジェクトの十分なビューがないため、個別のクラスが本当に必要になる可能性があると思います. これを行う 1 つの方法は、マクロを使用することです。サンプルは次のとおりです。

#include <iostream>
using  std::cout;
using  std::endl;

#define CUSTOM_CLASS(_CL) class _CL\
{\
      public:\
                  _CL(int foo, float bar) { cout << "Creating instance with foo=" << foo << ";bar=" << bar << endl;}\
       ~_CL() { }\
       bool SomePublicMethod() { cout << "Class created\n"; }\
};

CUSTOM_CLASS(myclass1);
CUSTOM_CLASS(myclass2);

int main()
{
    myclass1 instance1(1, 1.3f);
    myclass2 instance2(2, 0.3f);
    return 0;
}

g++ を使用してこれを実行すると、次の結果が得られます。

Creating instance with foo=1;bar=1.3
Creating instance with foo=2;bar=0.3
于 2013-09-23T05:01:29.513 に答える