-1

如何在没有单例的情况下创建此类的单个实例,以及如何声明它以便另一个类可以在不全局声明的情况下访问它?

请阅读代码(尤其是注释)以获得更好的理解:

#include <iostream>
#include <vector>

// The only class that will be using this class is Obj...
// There can only be a single instance of ObjManager but how can I do that
// without singleton???
class ObjManager
{
    friend class Obj;
    int i;
};

// Since I cannot think of a better way of accessing the SAME and ONLY ObjManager, I
// have decided to declare a global instance of ObjManager so every instance of
// Obj can access it.
ObjManager g_ObjManager;

class Obj
{
    friend class ObjManager;
public:
    void Set(int i);
    int Get();
};

void Obj::Set(int i) {
    g_ObjManager.i += i;
};

int Obj::Get() {
    return g_ObjManager.i;
};

int main() {
    Obj first_obj, second_obj;

    first_obj.Set(5);
    std::cout << second_obj.Get() << std::endl; // Should be 5.
    second_obj.Set(10);
    std::cout << first_obj.Get() << std::endl; // Should be 15.

    std::cin.get();
    return 0;
};
4

2 回答 2

1

为什么不这样:

class ObjManager
{
private:
    ObjManager() {} 

public:
    static ObjManager& get() {
        static ObjectManager m;
        return m;
    }
    friend class Obj;
    int i;
};

然后只需调用ObjManager::get以获取参考。作为奖励,只有在您实际使用它时才会构建它。它仍然是一个单例,但它比全局好一点(在我看来)。

于 2013-10-10T22:49:51.830 回答
0

如果您希望所有Obj实例共享同一个ObjManager实例(并且您不想使用 Singleton 模式使用 来创建Obj's ),您可以创建inObjManager的静态成员:ObjManagerObj

class ObjManager { ... };

class Obj
{
private:
   static ObjManager manager;
};

然后,当您创建 的实例时Obj,它将ObjManager与所有其他实例共享相同的内容。

于 2013-10-10T22:55:53.997 回答