c++ - 关于C++单例类的使用

标签 c++ singleton

我看过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/

相关文章:

c++ - 通过指针传递与通过引用传递

c++ - 函数返回静态对象的不同地址

PHP单元测试单例

c++ - 结合字符串和字符的大小

c++ - vector::erase 和 std::remove_if 的奇怪行为,其结束范围不同于 vector.end()

c++ - 通过函数指针调用 C++ 成员函数

.net - 如何使用静态成员创建.NET接口(interface)?

java - 是否可以使用使用构造函数参数的枚举来创建 Java 单例

objective-c - 单例中的 UISplitViewController 委托(delegate)

c++ - 使用 std::cout 和 using::std::cout 有什么区别?