我写了以下代码:
#include "joinCommand.h"
joinCommand::joinCommand(map<string, Task *>* threadMap) {
this->threadMap=threadMap;
}
string joinCommand::execute(vector<string> args) {
if(threadMap->count(&args.at(1)) ==1){
Task* t= this->threadMap["fkjk"];
}
}
编译器给出以下行的错误消息:
Task* t= this->threadMap["fkjk"];
错误消息是:
数组索引不是整数。
我应该如何从地图中获取Task*
的值?
答案 0 :(得分:3)
这里的问题有点微妙...... threadMap
可以访问this->threadMap
,但它也是一个指针。 this->threadMap
的类型为map<string, Task *> *
而非 map<string, Task *>
,因此当您对其执行[]
运算符时,它会对Task* t= (*this->threadMap)["fkjk"];
进行操作指针而不是取消引用的对象。
你需要这样做:
Task* t= (*(this->threadMap))["fkjk"];
更明确地说:
Task* t= this->threadMap->operator[]("fkjk");
或者,您可以使用箭头语法直接调用括号运算符:
Task* t= this->threadMap->at("fkjk");
作为另一种选择,您可以使用stl map的命名方法而不是重载运算符:
map<string, Task*>::iterator it = this->threadMap->find(&args.at(1));
if (it != this->threadMap->end()) {
Task *t = *it; // or just directly use *it or it->
// continue to use the valid 't' pointer
}
阅读此处的文档:
http://www.cplusplus.com/reference/map/map/
这一切都说完了,我建议你使用STL map的find()方法返回一个迭代器,然后检查它的有效性,然后取消引用,取而代之的是:
long binaryW = Long.parseLong(W[i-15], 2);
答案 1 :(得分:0)
从第一个函数我猜this->threadMap
是一个指针,因为你指定了另一个指针。这个猜测很好地符合错误信息。
因此,解决方案是在使用std::map
:
(*this->threadMap)["fkjk"];