我现在想要几个小时才能做到这一点。我想要做的是有一个存储在未命名的命名空间中的向量映射(向量包含指向对象的指针)。然后允许类通过函数调用访问向量中的数据。
//DataHandler.cpp
#include "DataHandler.h"
using std::vector;
using std::unordered_map;
namespace DataHandler
{
namespace
{
unordered_map< unsigned int, vector<MyClass*> > data_map_;
}
void receiveData(unsigned int key, vector< MyClass*>& data_vec)
{
//check if key already exists:
unordered_map<unsigned int, vector<MyClass*> >::iterator it;
it = data_map_.find(key);
if (it != data_map_.end())
{
data_vec = it->second;
return;
}
//generate new key with new data
data_map_.insert(make_pair(key, vector< MyClass*>()));
data_map_[key].push_back(new MyClass(/*some constructor arguments*/));
// ... push back some more instances of MyClass ...
//finally:
data_vec = data_map_[key];
return;
}
}
在其他一些课程中,我这样做是为了获得矢量:
//SomeOtherClass.cpp
#include "SomeOtherClass.h"
#include "DataHandler.h"
using std::vector;
void SomeOtherClass::aMethod()
{
vector<MyClass*> first;
vector<MyClass*> second;
vector<MyClass*> first_again;
DataHandler::receiveData(1, first); //works fine
DataHandler::receiveData(2, second); //works fine
DataHandler::receiveData(1, first_again); // <- strange behavior or segfault here
}
所以一切都按预期工作,除非我想访问之前填充了MyClass实例的向量 - 然后我得到奇怪的行为或分段错误。 有人可以向我解释为什么会这样,以及如何做到这一点?
谢谢!
答案 0 :(得分:0)
我看不出任何具体问题,所以这不是一个答案,但对于评论来说太长了。我将它标记为社区维基。无论如何,为什么没有std::unordered_map<unsigned, std::vector<MyClass>>
并摆脱所有的指针和终身问题? SomeOtherClass::aMethod()
可以执行insert
,返回std::pair<iterator,bool>
- 如果您希望稍后在MyClass
中访问aMethod
元素,请保存该迭代器。就像,如果你在first_again
中有一些指针,它们会在receiveData()
内被first
中的任何指针所破坏:有很多方法可能是内存泄漏,但我如果没有看到更多的代码,就无法肯定地说。