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,“高”)在程序停止或卸载存储类的dll文件之前,代码>不会被清除。我说的对吗?问题。
您显示的代码不应编译:您不能将对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项目设置(属性对话框)中进行调整。谢谢大家。也许我应该坚持原来的单身模式。