【发布时间】:2011-07-14 04:14:07
【问题描述】:
我经常使用单例,因为我讨厌将主类的对象传递给成员类以允许它们访问主类。
Class Foo
{
A* a;
B* b;
C* c;
};
例如在上面的示例中,如果 A、B 和 C 想要访问 Foo- 我必须将 Foo 的对象传递给他们每个人,并将其存储为他们的成员变量(或在每个函数中给出对象称呼)。这可行,但感觉不对,需要编写更多代码。
相反,我可以让 Foo 成为单例(当然只有在只有 1 个实例的情况下),然后从 A、B 和 C 调用 Foo::getInstance()->...。而我没有传递任何对象。我觉得这很方便。
现在,问题是我遇到了一个可能有多个 Foo 实例的情况。显然我不能使用单例模式。但我不想传递变量,也不想将它们存储在成员类中。代码太多! :)
例如, 我讨厌这个:
A::A(Foo* foo) : m_foo(foo)
{
}
还有这个:
void A::someFunc(Foo* foo, int someParam)
{
}
但是,我喜欢这个:
A::A()
{
}
void A::someFunc(int someParam)
{
Foo* foo = Foo::getInstance();
}
还有其他方法吗?类似于单例模式的东西?
【问题讨论】:
-
我不明白你为什么首先在 C++ 中使用单例。
-
@ptrdiff_t 您要解决的实际问题是什么?对我来说,你想要一些看起来像单例但仍然有多个实例的东西是没有意义的。发布“不方便”的代码将帮助我更好地了解您想要避免的事情。
-
使用单例乍一看似乎不错,但实际上它们会使您的代码变得更糟:- 它们使您的代码变得不那么清晰(代码以隐式方式依赖于上下文)- 它们使代码难以测试 - 它们使代码难以维护,主要是因为未来的变化它可能适用于小示例,但大项目应尽可能避免使用单例。
-
阿格。停止。停止。停止。去读一本关于编程的书或参加关于编程的课程。现在似乎使事情变得容易的东西只会使编程的所有其他部分变得异常困难。停下来。请记住,您的代码的维护者知道您住在哪里并且他拥有一把斧头。
-
我怀疑由于使用全局变量/单例而导致的几个 24 小时马拉松式调试会话,这些会话的状态以意想不到的方式发生了变化,这可能会改变您对它们有用性的看法。