English 中文(简体)
Qt C++: 全球目标与参考链
原标题:Qt C++: Global objects vs. reference chain

目前,我申请中某些全球物体使用单一吨位模式的Im( Sym环境的Qt应用)。 然而,由于一些问题(,C++ 检查单吨点就象我不得不改变逻辑。

我有3个班级(一些温器、环境和集装箱),我需要通过多个不同的物体进入。 目前,它们都是按照单一州模式创建的。 记录基本上只是一种公共方法记录仪,其中有一些内部逻辑,即当场和集装箱有多条接触/固定方法,有某种额外的逻辑(例如QFileSystemWatcher)。 此外,日志和场环境有一些相互参照(例如,日志需要一些环境和环境日志错误)。

目前,所有东西都是“工作罚款”,但是仍然有一些问题应当予以注意,而且似乎对单一州来说,执行起来并不容易(可能存在的记忆泄漏/点数)。 现在,我有两种不同的处理方式:

  1. Create global objects (e.g. extern Logger log;) and initialize them on application startup.
  2. Create objects in my main object and pass them to the children as a reference.

我几乎没有这些问题:

<>

  • Is it better to use stack or heap?
  • I m going to declare those objects in some globals.h header using extern keyword. Is it ok?
  • I think in this case I have to remove that 2-way reference (settings needs logger and vice versa.)?

<><>Case 2.

  • 如果物体在我的主物体(如洛格朗 * log = 新的洛格() 诉洛格人日志)中 st或薄;

  • 长期参照链并不看一ice(例如,如果我不得不将物体转过多个孩子)。

  • 什么是儿童?

    1. 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?
    2. 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?
  • 在这方面,我应该注意到多少记忆管理?

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? #define LOG Logger::Instance()->Log

感谢阅读。

最佳回答

简单概述:

  1. 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.
  2. if you use global objects, use lazy construction to avoid initialization order problems (initialize them when they are first accessed).
  3. 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.
  4. 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?

使用推进器:像上文安全数据一样,在电离器功能内作为静态物体广泛储存或仅储存贵级。

问题回答

我发现,另一个答案没有什么误导。 在这方面,希望SO社区能够确定哪些答案更好:

是否更好使用 st或肥皂?

假定“ st”是你所称的全球(因此在数据部分),不会对此感到担忧,而不管怎样,你都比较容易。 请注意,如果你在得票上分配,就不必删除。

我将在一些全球人头脑中用外部关键词宣布这些物体。 它吗?

为什么你们需要这样做? 唯一需要进入全球的阶层是单一州本身。 全球甚至可以是静态的地方变量,即:

class c_Foo
{
    static c_Foo& Instance()
    {
        static c_Foo g_foo; // static local variable will live for full life of the program, but cannot be accessed elsewhere, forcing others to use cFoo::Instance()
        return g_foo;
    }
 };

如果你不想使用静态的当地成员,那么“Foo”类(以我为例)的私人固定成员变量将比一个简单的全球更为合适。

你们希望,这一类的寿命是“全球”的(在申请离开之前不会被破坏),而不是情况本身。

我认为,在这种情况下,我必须删除这一双向参考(确定需要记录,反之亦然)?

所有被搁置的全球人都必须申报,但正如我前面所说的那样,你不需要这一标题。

如果物体在我的主物体(如洛格朗 * log = 新的洛格() 诉洛格人日志)中 st或薄;

我可以真的回答,不要再担心。

Long reference chains do not look nice (e.g. if i have to pass the object over multiple childrens).

什么是儿童?

你们已经认识到,这在暗中将是巨大的痛苦。 如果像伐木一样,只提及每一个模块就会造成混乱。 更适当的是单一固定的“行车监督记录”功能,如果您的登记记录确实有用,那么它就成为一个只见于你的记录功能的单一吨。 您可以在同一申请书中宣布并落实您的全部记录。 那么,别无一了解这一特殊功能。

我指的是:

档案:记录。 h

#ifndef LOG_H
#define LOG_H

void Log( const char* data ); // or QString or whatever you re passing to your logger

#endif//LOG_H

档案:记录

#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 );
}

这是一种细微的伐木界面,是你的单一州的所有权力,有限引信。

当Im使用时,有可能出现记忆泄露。 单一吨毁灭是什么?

如果你在多面的环境下 allocat忙地分配单一吨,就有可能出现双重瞬时。 这将造成过剩的泄漏。

如果你使用静态地方:,

我认为,在开始执行时进行明确的施工是最佳选择,但是,在数据部分(类别或全球变量的静态变量)中,还是很难做到。 如果你在座右边分配,你也应该删除。





相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?

热门标签