2

(C ++で)クラス(クラスfoo)をインスタンス化できるかどうか疑問に思っていましたが、クラスはすでにインスタンス化されたオブジェクトを返すと言っていました。(foo::インスタンス())

つまり、クラスが独自のメソッドを介してそれ自体を返すようにすることはできますか? プログラムの早い段階でクラス (つまり、class foo) を作成できるようにしたいので、既にセットアップされて準備が整っています。次に、そのオブジェクトを呼び出し元の関数に引数として渡すことなく、そのクラスから関数を呼び出せるようにしたいと考えています。私はそのようなことをすることができますか: MyClass::ReturnSelf()->foo(); または MyClass::ReturnSelf().foo();

編集:これは少し不明確かもしれないことに気付きました。新しいオブジェクトを作成せずに、既にインスタンス化されたオブジェクトのメソッドとメンバーを使用できるように、別のクラスでこの「自己復帰型」メソッドを呼び出せるようにしたいと考えています。

4

3 に答える 3

6

おめでとうございます。シングルトン パターンを発見しました。あなたがまだそれを知らなかったなら、かなりの警告です。

struct X
{
   static X& instance()
   {
       static X x;
       return x;
   }

   void foo();
};

メソッドを次のように呼び出します。

X::instance().foo();

もちろん、それがstaticオプションである場合は、メソッドを作成して直接呼び出すこともできます。

X::foo(); //this requires foo to be declared static

メソッドからインスタンスを返す効果は、メソッドチェーンにも使用できます。

struct Element
{
    Element& setColor() { return *this; }
    Element& setWidth() { return *this; }
};

Element e;
e.setColor().setWidth();
于 2012-11-24T00:52:54.007 に答える
0

staticメンバー関数は通常、次のトリックを行います。

struct Foo
{
    static Foo & special_instance()
    {
        static Foo impl;  // Alarm bells: This is a global state!
        return impl;
    }

    // ...
};

使用法 (コード内のどこからでも):

Foo & f = Foo::special_instance();
// ...

privateこの種のオブジェクト作成が唯一のオプションになるように、クラスのすべてのコンストラクターを作成する追加のオプションがあります。これは一般的に扱いにくい設計ですが、便利な場合もあります。問題を正しくモデル化しているのか、それとももっと単純なことでうまくいくのか、気をつけてください。

于 2012-11-24T00:57:13.570 に答える
0

これは少し不明確かもしれないことに気づきました。新しいオブジェクトを作成せずに、既にインスタンス化されたオブジェクトのメソッドとメンバーを使用できるように、別のクラスでこの「自己復帰型」メソッドを呼び出せるようにしたいと考えています。

静的クラス メソッド instance() で返すことができる型 foo のクラス foo でクラス変数を定義します。また、タイプ *foo を指定して、最初の ctor にポインターを設定することもできます。これにより、クラスからの派生が可能になります。

class Foo
{
   # class variable pointing to first instance
   static foo* pFoo = null;

   # constructor, sets pointer to first instance 
   Foo()
   {
      if (!pFoo) pFoo = this;
      /* ... */
   }

   # static class method returning instance
   static foo* instance() {return pFoo;}
}
于 2012-11-24T00:58:04.163 に答える