简单概述:
- if you use global objects, prefer the singleton pattern as a lesser evil. Note that a singleton should have global access! Dan-O s solution is not really a singleton pattern and it defeats the power of singletons even though he suggests it s no different.
- if you use global objects, use lazy construction to avoid initialization order problems (initialize them when they are first accessed).
- if you use singletons, instead of making everything that needs to be globally acccessible a singleton, consider making one singleton (Application) which stores the other globally-accessible objects (Logger, Settings, etc.) but don t make these objects singletons.
- if you use locals, consider #3 anyway to avoid having to pass so many things around your system.
[Edit]我犯了错误,错误地将静态的静态置于安全的状态之中,丹麦指出了这一点。 为此感谢他。 我眼光失明了,没有根据他要求的问题来犯错误,导致局势恶化。 我试图解释单一州的zy施工(ka lazy 装载)行为,他不说我犯了错误,我直到第二天才意识到我。 我不关心争论,只提供最佳咨询意见,但我必须强烈反对某些建议,特别是:
#include "log.h"
// declare your logger class here in the cpp file:
class Logger
{
// ... your impl as a singleton
}
void Log( const char* data )
{
Logger.getInstance().DoRealLog( data );
}
如果你们要与像单一州这样的全球无障碍物体接触,那么至少要避免这种情况! 它可能向客户发出呼吁,但反对单一州试图缓解的许多问题。 你希望有一个可以公开查阅的单一州案例,如果你设立这样的后勤职能,你就希望通过你的单一州审查。 造成这种情况的原因很多,但这里只是一种情况:你可能希望建立单独的单一州,并有一个共同的接口(errorlogger诉警告日志与用户信息记录系统,例如)。 这种方法不允许客户选择和使用共同伐木接口。 这还迫使每当你做些事情时就找回单一州,这样,如果你决定从单一州走,就会有更多的法典重写。
Create global objects (e.g. extern
Logger log;) and initialize them on
application startup.
至少在用户界定类型的所有成本上避免这种情况。 给予目标外部联系意味着,你的记录将在主要切入点之前建造,如果取决于任何其他全球数据,则不会保证初始化令(可进入未入的物体)。
相反,在进入初始阶段即考虑这种做法:
Logger& safe_static()
{
static Logger logger;
return logger;
}
或者在你的情况下:
// Logger::instance is a static method
Logger& Logger::instance()
{
static Logger logger;
return logger;
}
在这项职能中,在采用安全-静态方法之前,不会建立标识。 如果你对所有类似数据都适用,那么你就不必担心初始化令,因为初始化令将遵循准入模式。
请注意,尽管有其名字,但还是有安全的青春期。 如果两条镜头同时第一次安全使用——静电,这仍然容易出现可怕的问题。 避免这种做法的一个办法是在申请开始时采用这些方法,以确保数据成为启动员额的初始。
Create objects in my main object and
pass them to the children as a
reference.
可能变得繁琐,并大幅增加法典规模,以绕过这种方式传递多种物体。 考虑将这些物体合并成一个具有所有必要背景数据的合计体。
使用 st或肥皂更好吗?
从总体上看,如果你的数据是小的,并且能够安抚,那么打脚石一般更为可取。 住房分配/分配是超速的(合理的加固/取消分档登记),而且没有任何争议。
然而,由于你正在特别就全球目标提出这一要求,因此,这种分门别类的意思并不大。 也许你会问,你是否应当使用肥皂或数据部分。 后者对许多案件处以罚款,没有受到记忆泄漏问题的影响。
I m going to declare those objects in
some globals.h header using extern
keyword. Is it ok?
页: 1
I think in this case I have to remove that 2-way reference (settings
needs logger and vice versa.)?
努力从你的法典中消除循环依赖,总是有好处的,但如果你可以 t,@安全。
If I pass a pointer to the children
like this (I don t want to copy it,
just use the "reference"):
Children(Logger *log) : m_Log(log)
what happens when the children is
deleted? Should I set the local
pointer m_Log to NULL or?
没有必要这样做。 假定为记录员的记忆管理,在儿童中没有处理。 如果你想要一个更强有力的解决办法,你可以利用动力:共享——吸收器和计票来管理日志。
If I use stack I ll send reference to
the child (Children(Logger &log) :
m_Log(log)) where m_Log is a reference
variable (Logger& m_Log;) right?
无论你是否使用 st子或肥皂,你都可以通过参考。 然而,储存点是成员而不是提及方,其好处是,汇编者可在其所希望的情形下(如果适用的话)产生有意义的转让操作者,但你无需明确定义。
Case 3. Continue with singleton and
initialize singleton objects during
the startup (that would solve the null
pointers). Then the only problem would
possible memory leaks. My
implementation follows this example.
Is there a possible memory leak when
I m accessing the class using. What
about singleton destruction?
使用推进器:像上文安全数据一样,在电离器功能内作为静态物体广泛储存或仅储存贵级。