gpt4 book ai didi

c++ - 跨多个对象使用 map

转载 作者:行者123 更新时间:2023-12-01 14:53:42 24 4
gpt4 key购买 nike

我使用全局映射来注册一个或多个相同类型的对象。为此,我首先使用了全局 namespace 。

以此为例(未经测试的代码,仅作为示例):

//frame.h
class frame
{
public:
frame(int id);
~frame();
};

namespace frame_globals
{
extern std::map<int, frame *> global_frameMap;
};
//frame.cpp
#include "frame.h"
namespace frame_globals
{
std::map<int, frame *> global_frameMap;
}

frame::frame(int id)
{
//[...]
//assuming this class is exclusively used with "new"!
frame_globals::global_frameMap[id] = this;
}

frame::~frame()
{
frame_globals::global_frameMap.erase(id);
}

这是我使用的一个相当快速的解决方案,但是现在我又迷失了用例,我需要注册对象,并问自己是否有比使用全局变量更好的方法(我想摆脱这种情况) )。

[编辑:似乎不正确]
(据我所知)静态成员变量是不可行的,因为静态在每个对象中都是内联的,而我需要在所有对象中使用它。

做这个的最好方式是什么?我想到了使用共同的 parent ,但我想轻松地访问框架类。您将如何解决?

还是您知道更好的方法来注册对象,以便可以从其他地方获得指向它的指针?因此,我可能不会只需要“新建”并保存“此”?

最佳答案

我会考虑逆转设计。例如。使用语言构建的功能有什么问题?

std::map<int, frame> frames_;

frames_.emplace(id);//adding, ie. creating frames

frames_.erase(id)//removing, ie. deleting frames

现在创建/删除就像以前一样容易。巧合的是,如果有人需要框架用于其他目的,那么这里就没有问题。如果frame应该是多态的,则可以存储 std::unique_ptr

我也考虑将 id设为框架的成员,然后存储在 std::set中而不是std::map中。
class frame
{
public:
int id;
frame(int id);

friend bool operator <(const frame& lhs, const frame& rhs) {return lhs.id < rhs.id;}
};

std::set<frame> frames_;

删除只是:
frames_.erase(frame);

但是,为了基于id进行查找现在变得有些复杂。幸运的是,这里有一个解决方案。这要求实现一个透明的比较,其中包括定义 is_transparent

总体而言,您需要考虑所有权。问问自己:在哪里或谁将拥有/存储 map /框架指针/等。存放在那里。如果是共享所有权,请使用 shared_ptr(但在实际需要时仅使用此模式-比人们使用它的方式更为罕见)。

一些相关的核心准则

I.3避免单例

R.5 and R.6避免使用非常量全局变量

R.11避免调用new并显式删除

R.20 and R.21除非您需要共享所有权,否则优先于unique_ptr而不是shared_ptr

关于c++ - 跨多个对象使用 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59873500/

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