Как вернуть один и тот же экземпляр для каждой инициализации класса в C ++? - PullRequest
2 голосов
/ 30 января 2011

Я хочу создать класс, который может иметь только один экземпляр.Если я попытаюсь создать другой экземпляр класса, он вернет первый экземпляр.

Ответы [ 3 ]

5 голосов
/ 30 января 2011

Я думаю, что вы ищете шаблон Singleton в C ++.Вот реализация и вот учебник по Linux для одноэлементного шаблона в C ++

2 голосов
/ 30 января 2011

Я думаю, что вы хотите ближе к MonoState , чем Singleton.

MonoState работает, когда все объекты имеют одинаковое состояние через статические переменные-члены.Хотя экземпляры различны, данные, возвращаемые ими, одинаковы.Вот простая реализация:

class MonoStateSession {
private:
  static int _SessionId;

public: 
  void SetSessionId(int newSessionId) {
    //Put threading checks/locks here
    _SessionId = newSessionId;
  }

  int GetSessionId() {
    return _SessionId;
  }
}

//Usage
MonoStateSession session1 = new MonoStateSession();
session1.SetSessionId(123);
MonoStateSession session2 = new MonoStateSession();
assert(session2.GetSessionId() == 123);
1 голос
/ 31 января 2011

Нет ... но вы можете приблизиться к этому. Например, вы можете создать класс, в котором каждый экземпляр является просто клоном одного и того же реального объекта ... например:

struct TheRealObject
{
    std::string s;

    TheRealObject() { ... }
    void foo(int x) { ... }
    double bar(char y) { ... }

    static TheRealObject& getInstance()
    {
        static TheRealObject trb;
        return trb;
    }
};

struct MyObject
{
    std::string& s;

    MyObject() : s(TheRealObject::getInstance().s) {}

    void foo(int x) { TheRealObject::getInstance().foo(x); }
    double bar(char y) { return TheRealObject::getInstance().bar(y); }
};

Обратите внимание, что каждый экземпляр MyObject по-прежнему будет отдельным объектом (например, со своим собственным адресом), но он будет просто батутом к единственному существующему экземпляру TheRealObject как для доступа к методам, так и для доступа к элементам данных.

Почему ты хочешь сделать что-то странное? Может быть, вы просто ищете синглтон (например, TheRealObject в приведенном выше)?

...