gpt4 book ai didi

c++ - 如何解决全局访问的问题?

转载 作者:行者123 更新时间:2023-11-30 00:42:18 26 4
gpt4 key购买 nike

我正在构建一个应用程序,我需要 SO 社区在设计问题上的智慧。

在我的应用程序中,需要恰好有一个类 UiConnectionListUiReaderUiNotifier 的实例。

现在,我想到了两种方法:

方法一:每个文件在头文件本身中都有该类的全局实例。

方法 2:有一个单独的 globals.h 文件,其中包含每个类的单个全局实例。

示例代码:

方法一

文件:uiconnectionlist.h

#ifndef UICONNECTIONLIST_H
#define UICONNECTIONLIST_H

#include <QObject>
#include <QList>

class UiConnection;

class UiConnectionList : public QObject
{
Q_OBJECT
public:
UiConnectionList();

void addConnection(UiConnection* conn);
void removeConnection(UiConnection* conn);
private:
QList<UiConnection*> connList;
};

namespace Globals {
UiConnectionList connectionList;
}

#endif // UICONNECTIONLIST_H

文件:uinotifier.h

#ifndef UINOTIFIER_H
#define UINOTIFIER_H

class UiNotifier
{
public:
UiNotifier();
};

namespace Globals {
UiNotifier uiNotifier;
}

#endif // UINOTIFIER_H

方法二:

文件:uiconnectionlist.h

#ifndef UICONNECTIONLIST_H
#define UICONNECTIONLIST_H

#include <QObject>
#include <QList>

class UiConnection;

class UiConnectionList : public QObject
{
Q_OBJECT
public:
UiConnectionList();

void addConnection(UiConnection* conn);
void removeConnection(UiConnection* conn);
private:
QList<UiConnection*> connList;
};

#endif // UICONNECTIONLIST_H

文件:uinotifier.h

#ifndef UINOTIFIER_H
#define UINOTIFIER_H

class UiNotifier
{
public:
UiNotifier();
};

#endif // UINOTIFIER_H

文件:globals.h

#ifndef GLOBALS_H
#define GLOBALS_H

#include "uiconnectionlist.h"
#include "uinotifier.h"

namespace Globals {
UiConnectionList connectionList;
UiNotifier uiNotifier;
}

#endif // GLOBALS_H

我的问题

更好/正确的方法是什么?

PS:我认为单例不是这里的正确答案,是吗?

谢谢


好的,所以两个答案告诉我创建 UiConnectionListUiNotifier 的实例,可选择将其包装在 UiContext 中并传递在任何需要的地方。

有人可以列举原因(举例说明)为什么传递上下文比使用全局可访问变量更好。

这将帮助我判断哪种方法更好(或更适合我的应用)。

谢谢

最佳答案

随着您在 globals.h 中的使用,您将为您使用的每个编译单元(.cc 或 .cpp 文件)定义 Globals::UiConnectionList 和 Globals::UiNotifier。这不是只创建这些类的一个实例的方法。您应该按照以前的海报建议使用单例模式。

如果您不想使用单例模式,正确的方法是在一个编译单元中定义这两个类,然后将它们声明extern 在头文件中,结果是您想要的类的一个全局实例,但这不会阻止它被复制或复制构造。从您的示例中,您不知道声明和定义之间的区别。

关于c++ - 如何解决全局访问的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1403410/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com