我写了以下代码:
#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*
的价值?
这里的问题有点微妙...... 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");
作为另一种选择,您可以使用stl map的命名方法而不是重载的运算符:
Task* t= this->threadMap->at("fkjk");
阅读此处的文档:
http://www.cplusplus.com/reference/map/map/
这一切都说完了,我建议你使用STL map find()方法返回一个迭代器,并检查它的有效性而不是取消引用,而是这样的:
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
}
从第一个函数我想this->threadMap
是一个指针,因为你指定了另一个指针。这个猜测很好地符合错误信息。
因此解决方案是在使用std::map
中的函数之前取消引用指针:
(*this->threadMap)["fkjk"];