2

我想知道(在 C++ 中)你是否可以实例化一个类(类 foo)然后说类返回已经实例化的对象。(foo::instance())

换句话说,我可以让一个类通过它自己的方法返回它自己吗?我希望能够在我的程序早期创建一个类(即类 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();

当然,您也可以创建 method 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

我刚刚意识到这可能有点不清楚。我希望能够让另一个类调用这个“自返回”方法,这样它就可以使用已经实例化的对象的方法和成员,而无需创建新对象。

在 foo 类型的类 foo 中定义一个类变量,您可以在静态类方法 instance() 中返回它。你也可以尝试给它类型 *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 回答