C++ 带参考变量的单例

C++ 带参考变量的单例,c++,singleton,C++,Singleton,我需要几个在程序运行时始终可用的唯一对象。我遵循了单例设计模式,它建议使用方法getInstance()获取对象。但我更喜欢在不调用方法的情况下立即检索对象。所以我编写了一个类,它提供了几个由引用类型而不是指针返回的唯一对象 class Priority { public: static Priority &High; static Priority &Medium; static Priority &Low; std::string g

我需要几个在程序运行时始终可用的唯一对象。我遵循了单例设计模式,它建议使用方法
getInstance()
获取对象。但我更喜欢在不调用方法的情况下立即检索对象。所以我编写了一个类,它提供了几个由引用类型而不是指针返回的唯一对象

class Priority
{
public:
    static Priority &High;
    static Priority &Medium;
    static Priority &Low;

    std::string getName(void);
    int getLevel(void);

private:
   Priority(int level, std::string const& name);
   ~Priority();
   Priority(Priority const&);
   const Priority &operator = (Priority const&);

   int level_;
   std::string name_;
};

Priority &Priority::High   = Priority(3, "High");
Priority &Priority::Medium = Priority(2, "Medium");
Priority &Priority::Low    = Priority(1, "Low");

Priority::Priority(int level, std::string const& name)
   : level_(level), name_(name)
{ }

Priority::~Priority() { }

inline std::string Priority::getName(void)
{
    return name_;
}

inline int Priority::getLevel(void)
{
    return level_;
}

我编写了一个使用上述类的示例程序

int main()
{
    Priority &m = Priority::High;
    std::string name = m.getName();
    int level = m.getLevel();
    return 0;
}

该计划运作良好。因此,我假设为变量分配内存
优先级和优先级::高=优先级(3,“高”)不会被清除。我说的对吗?

问题。 您显示的代码不应编译:您不能将对non-
const的引用绑定到右值

< P > Visual C++ 11和G+4.7.1:< /P> [D:\dev\test] > cl foo.cpp foo.cpp foo.cpp(27) : warning C4239: nonstandard extension used : 'initializing' : conversion from 'Priority' to 'Priority &' A non-const reference may only be bound to an lvalue foo.cpp(28) : warning C4239: nonstandard extension used : 'initializing' : conversion from 'Priority' to 'Priority &' A non-const reference may only be bound to an lvalue foo.cpp(29) : warning C4239: nonstandard extension used : 'initializing' : conversion from 'Priority' to 'Priority &' A non-const reference may only be bound to an lvalue [D:\dev\test] > gnuc foo.cpp foo.cpp:27:48: error: invalid initialization of non-const reference of type 'Priority&' from an rvalue of type 'Priority' foo.cpp:28:50: error: invalid initialization of non-const reference of type 'Priority&' from an rvalue of type 'Priority' foo.cpp:29:47: error: invalid initialization of non-const reference of type 'Priority&' from an rvalue of type 'Priority' [D:\dev\test] > _
C++修复了这个问题。

代替LValk引用,可以使用rValk引用,但是Visual C++对此很满意,但G+然后抱怨私有析构函数。

因此,尽管有参考意见,但它的目的是什么您可以简单地使用普通的静态数据成员


但是,与Meyers的单例相反,使用普通静态数据成员时,您可能会遇到意外的风险。所以,如果您绝对必须提供globals,我建议使用单例。至于单例,使用最简单的解决方案通常是最好的,这意味着(我只是链接了第一个看起来合理的google结果)。

这甚至不应该编译,你正在用临时对象初始化引用。然而,你根本不需要参考资料;只需直接将静态成员声明为对象:

在标题中:

class Priority
{
public:
    static Priority High;
    static Priority Medium;
    static Priority Low;
//...
};
Priority Priority::High(3, "High");
Priority Priority::Medium(2, "Medium");
Priority Priority::Low(1, "Low");
在源文件中:

class Priority
{
public:
    static Priority High;
    static Priority Medium;
    static Priority Low;
//...
};
Priority Priority::High(3, "High");
Priority Priority::Medium(2, "Medium");
Priority Priority::Low(1, "Low");

如果你不确定的话,你可以直接存储对象而不是引用..我使用引用是因为我想避免每次调用唯一的对象时复制它们自己。Priority m=Priority::High将返回Priority::High的副本,这确实浪费了内存。但您已经隐藏了副本构造函数。我正在使用Visual Studio Express 2012 for Windows Desktop和平台工具集Windows7.1SDK。它在调试和发布模式下编译时都没有任何问题。我再次尝试使用明文,它显示了你上面发布的结果。@ USE185388:你需要提高你的VisualC++警告级别,如答案中所解释的。您可以在VisualStudio项目设置(属性对话框)中进行调整。谢谢大家。也许我应该坚持原来的单身模式。