9

type::baseいくつかの一般的な機能と流暢なインターフェースを備えた基本(抽象)クラス(と呼びましょう)を構築したいと思います。私が直面している問題は、これらすべてのメソッドの戻り値の型です

  class base {
    public:
       base();
       virtual ~base();

       base& with_foo();
       base& with_bar();
    protected:
       // whatever...
  };

これで、サブタイプを作成できます。たとえば、次のようになります。

  class my_type : public base {
    public:
      myType();        
      // more methods...
  };

これらのサブタイプを次のように使用すると、問題が発生します。

 my_type build_my_type()
 {
    return my_type().with_foo().with_bar();
 }

my_type の代わりに base を返すため、これはコンパイルされません。

私はただできることを知っています:

 my_type build_my_type()
 {
    my_type ret;
    ret.with_foo().with_bar();

    return ret;
 }

しかし、どうすれば実装できるかを考えていましたが、有効なアイデアが見つかりませんでした。何か提案はありますか?

4

5 に答える 5

4

参照/ポインターを返す必要があり、型情報を保持する必要はありません。

class base {
  public:
     base();
     virtual ~base();

     base &with_foo();
     base &with_bar();
  protected:
     // whatever...
};

class my_type : public base {
  public:
    my_type();        
    // more methods...
};

base *build_my_type()
{
   return &new my_type()->with_foo().with_bar();
}

すでに仮想デストラクタがあります。おそらく、他の仮想機能があります。基本型とそこで宣言された仮想関数を介してすべてにアクセスします。

于 2009-06-25T00:21:29.193 に答える
-1

C++ では、値ではなくポインターまたは参照を返す必要があります。また、「流暢なインターフェース」の意味を説明することもできます。

于 2009-06-24T22:50:05.743 に答える
-2

私が C# でそれを行う方法は、C++ でも機能すると信じていwith_foo()ますwith_bar()

class base {
  virtual base with_foo()
  { throw new NotImplementedException(); }
  virtual base with_bar();
  { throw new NotImplementedException(); }
}
于 2009-06-24T22:42:30.737 に答える