自我归还的课程?

时间:2012-11-24 00:51:21

标签: c++ class reference instantiation

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

换句话说,我可以让一个类通过它自己的方法返回它吗?我希望能够在程序的早期创建一个类(即类foo),因此它已经设置好并准备好了。然后,在该行的更远处,我希望能够从该类调用函数,而不必将该对象作为参数传递给我的调用函数。我可以这样做吗: MyClass::ReturnSelf()->foo(); 要么 MyClass::ReturnSelf().foo();

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

3 个答案:

答案 0 :(得分:4)

恭喜,你发现了singleton pattern。如果你还不知道的话,还有一点需要注意。

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();

答案 1 :(得分: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的所有构造函数,以便此类对象创建是 only 选项。这通常是笨拙的设计,但可能存在有用的情况。请注意你是否正确地模拟你的问题,或者你是否可以使用更简单的东西。

答案 2 :(得分: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;}
}