问题描述
我尝试动态创建可能具有不可达节点的图。这些节点将在创建时转换为新图。然后,将所有图形保存在
MaterialArch是图形
MatArchNode是一个节点
创建主图:
const client = new MongoClient('mongodb://admin:admin@localhost:30000');
await client.connect();
db = client.db('data');
generate函数,将不可达的节点转换为图:
void Console::newMaterial(std::string name,int size){
if(!isVariable(name)){
if(!inMaterial(name)){
std::shared_ptr<MaterialArch> mat = std::make_shared<MaterialArch>(m_matPop.get());
mat->generate(size);
m_matPop->add(name,mat);
}
}
else{
print("Error : Material name already used");
}
}
我将图形放在地图中的函数:
void MaterialArch::generate(int nbNodes){
std::vector<std::shared_ptr<MatArchNode>> nodeList;
if(m_root == nullptr){
m_root = std::make_shared<MatArchNode>();
m_root->generate();
nodeList.push_back(m_root);
for (int i = 1; i < nbNodes; ++i) {
std::shared_ptr<MatArchNode> nextNode = std::make_shared<MatArchNode>();
nextNode->generate();
nodeList.push_back(nextNode);
}
if(nodeList.size() < 2){
return;
}
for (auto node : nodeList) {
//linking
}
}
std::vector<std::shared_ptr<MatArchNode>> newRoots;
for (auto node : nodeList) {
bool unreachable = true;
if(!node->orpheline(m_root)){
unreachable = false;
}
for (auto root : newRoots) {
if(!node->orpheline(root)){
unreachable = false;
}
}
if(unreachable){
std::cout << "@ORPH" << std::endl;
std::shared_ptr<MaterialArch> orph = std::make_shared<MaterialArch>(m_matPop.get());
orph->setRoot(node);
m_pop->add(m_pop->orphName(),orph);
newRoots.push_back(node);
}
}
}
我的问题是,一旦我脱离了generate(),每个orph shared_ptr都是空的。我以为是因为我尝试访问已删除的对象,但是在函数中以相同的方式创建了主图,并且主图不是空的。
预先感谢您的帮助
解决方法
对不起,我很糟糕,我的setRoot()看起来像这样:
if(!orpheline(node)){
m_root = node;
}
因此未设置根目录,因为节点始终不可访问