帮助进行半复杂的C++赋值

cak*_*rus 5 c++

这是一个非常简单的问题,我很确定,但我很感激帮助.:)

这是.h文件中的变量:

map<int, map<int, map<int, CString>*>*> batch;
Run Code Online (Sandbox Code Playgroud)

这是我试图分配一个值:

((*((*(batch[atoi(transnum)]))[1]))[atoi(*docnum)]) = page;
Run Code Online (Sandbox Code Playgroud)

我在尝试解决这个问题时添加了一些额外的括号,以确保以正确的顺序处理derefs - 不幸的是,它仍然不起作用.我的应用程序在运行此行时崩溃了.我把它包装在try {} catch {}中,但似乎没有异常抛出.我不经常使用C++,并且想知道是否有人可以告诉我我做错了什么.

这是我正在尝试建模的关系:

交易号码(整数)列表,需要按键排序.

对于每个交易号,我有两种类型的文件,支付和发票(在我的数据结构中,分别由0和1表示的桶)

在每个类型桶中,可以有一个或多个文档,这些文档需要按id(docid)排序

每个docid都链接到一个字符串,该字符串由文件系统上用于处理的逗号分隔的文件列表组成.

如果您认为有更好的数据结构可供使用,我会有兴趣听到它.

编辑:我知道有很多更好的方法来做到这一点.情节是我被交给了一堆可怕的MFC-riddled C++代码,并告诉我昨天要完成一些事情.它基本上归结为在那里获取数据结构,加载它然后在其他地方输出它.当我问这个问题时,我只是想快速地把它砸出来.我很欣赏这些设计建议.

fbr*_*eto 17

方法std::map是,如果它还不存在,它将分配您尝试引用的节点.这意味着除非您分配子图并将它们插入到您的超图中,否则您将获得指向您不拥有的内存的指针.此时,当您尝试写入该内存时,您将崩溃.

地图需要堆分配吗?如果不是,您可以将类型更改为:

map<int, map<int, map<int, CString> > > batch; // don't forget the spaces
Run Code Online (Sandbox Code Playgroud)

你的电话可以是:

batch[atoi(transnum)][1][atoi(*docnum)] = page;
Run Code Online (Sandbox Code Playgroud)


GMa*_*ckG 13

首先,typedef这些事情变得更加容易:

typedef std::map<int, CString> page_map;
typedef std::map<int, page_map> document_map;
typedef std::map<int, document_map> batch_map;

batch_map batch;
Run Code Online (Sandbox Code Playgroud)

请注意,您几乎总是喜欢堆栈以动态分配.其次,你做的太多了!

int transNumber = atoi(transnum);
int docNumber = atoi(*docnum); // why is docnum a pointer?

batch[transNumber ][1][docNumber] = page;
Run Code Online (Sandbox Code Playgroud)

现在,如果您需要调试,您可以轻松检查这些值,并且更容易看到您犯错的位置.

我认为通过更多信息,我们可以更简单地完成这项工作.我想不出为什么在地球上你需要这样的东西.


Ric*_*dle 11

这条线是方式过于复杂.

您需要将其分解为更小的部分,将每个部分转换为命名变量.

  • 我同意.在尝试减少代码行数的意义上,此代码看起来像是一些过早优化. (5认同)

cra*_*str 5

如果你声明:

map<int, map<int, map<int, CString> > > batch;//no asterisks!
Run Code Online (Sandbox Code Playgroud)

你应该能够做到这一点:

batch[atoi(transnum)][1][atoi(*docnum)] = page;
Run Code Online (Sandbox Code Playgroud)