0

私は基本クラスを持っています、

class Msg
{
   public:

     ParseMsg()
     {
         ParseMsgData();
         ParseTrailer();
     }
     virtual void ParseMsgData() = 0;
     ParseTrailer();

};

および派生クラス、

class InitiateMsg : public Msg
{
    public:
    void ParseMsgData() { ... }
};


class ReadOperationMsg  public Msg
{
   public:
    void ParseMsgData() { ... }
};


class WriteOperationMsg  public Msg
{ 
   public:

    void ParseMsgData() { ... }
};

シナリオは以下のとおりです。

    void UsageFunction(string data)
    {
      Msg* msg = ParseHeader(data);
      ParseMsg
    }

   Msg* ParseHeader(string data)
   {

        Msg *msg = NULL;
           ....
         switch() 
         {

            case 1: 

                 msg = new InitiateMsg();
                 break;
            case 2:
                 msg = new ReadOperationMsg{();
                 break;
             case 3:
                 msg = new WriteOperationMsg{();
                 break;
               ....

         }

          return msg;           
    }

データに基づいて ParseHeader メソッドが作成する必要があるオブジェクトを決定するため、使用しているクラスの外部に ParseHeader 関数を実装しました。Msg クラス内で ParseHeader 関数を作成して使用するにはどうすればよいですか?

C# では、クラス内で ParseHeader メソッドを static として定義し、それを外部から使用することで同じことが実現されます。

4

2 に答える 2

4

Abstract Factory Design パターンが必要です。あなたのようなシナリオのためにカスタムメイドされています。
インライン リンクでは、簡単な例を使用して、ここで説明するよりもはるかに詳細に説明しています。

于 2012-04-10T05:15:27.050 に答える
0

さて、有用なコメントの前に、それらをパブリックとして宣言することを忘れ、クラス定義で継承関係を宣言することを忘れます。

あなたの質問に対して、ParseHeader関数を基本クラスMsgのパブリックメンバーメソッドとして直接宣言してみませんか。そうしても問題はありません。

依存関係の問題があるかもしれません。メソッドをMsgの宣言として配置し、cppファイルで本文を定義する必要があります。何かのようなもの:

// in Msg.h
// all other lines are omitted
public:
  Msg* ParseHeader(string data);


// in Msg.cpp
#include "Msg.h"
#include "InitiateMsg.h"
#include "ReadOperationMsg.h"
#include "WriteOperationMsg.h"

Msg* Msg::ParseHeader(string data) {
// .....
}

また、ベースポインタがある場合に、それがどのクラスであるかを正確に区別したい場合。私がそれをしているなら、私はそれを覚えるために基本クラスでエムンを宣言します。何かのようなもの:

// Msg.h
class Msg{
public:
    enum type_t {
      TBase,
      TInit,
      TRead,
      TWrite
    } type;

次に、それぞれの異なる構築方法で、型変数に異なるtype_tを定義します。その結果、ポインタがポインタであるクラスをいつでも確認でき、試行を逃すことなく動的なクラスキャストを実行できます。

于 2012-04-10T11:41:58.747 に答える