我看过this thread关于单例类实现,但不清楚如何在实践中使用它。为了使上下文更具体,假设我有一个输入流 std::istream
实例,许多不同的类需要访问它,但我没有为每个类构造函数传递它,而是考虑使用单例类 Connection
来包装此信息。所以客户只需调用:
Connection.getInstance().get_input_stream();
我的问题有两个:(1)这是对单例类的正确使用吗(2)在实现这个时,我试过这样的事情:
class Connection {
public:
static Connection& getInstance() {
static Connection instance; // Guaranteed to be destroyed
return instance;
}
std::istream& get_istream() {
return is;
}
void set_istream(std::istream & stream) {
is = stream;
}
private:
std::istream& is;
}
首先,这段代码由于某种原因无法编译。其次,在可用之前必须调用 set_istream()
感觉很尴尬。有没有更好的方法来完成这项工作?谢谢。
编辑:显然,正如你们中的许多人指出的那样,尝试分配引用是我的愚蠢行为。第二部分是如何将 stream
信息传递给单例——这似乎不值得,这表明这可能是一个错误的使用案例。谢谢大家的回答。
最佳答案
引用在创建后无法修改,因此要“设置”istream,您必须将其传递给构造函数:
class Connection {
/* ... */
Connection(std::istream & stream) : is(stream) {}
private:
std::istream& is;
}
然而,这引发了一个问题,即在创建静态实例时如何将正确的流传递给 ctor —— 答案是它很重要(充其量)。您可以使用指针而不是引用,这样您就可以创建一个对象并将其指向实际的流,但此时您基本上是在自找麻烦(需要两阶段初始化)。
最终,这不值得。我的建议是完全反对在这种情况下使用单例。看起来它增加了相当多的工作,并且提供的返回很少(如果有的话)。
不少人开始建议完全不要使用 singleton
,至少在 C++ 中是这样,坦率地说,大多数时候我倾向于同意。出现这种情况的原因是——通常您所做的工作最终得不到什么返回。
关于c++ - 关于C++单例类的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9316819/