【发布时间】:2020-11-04 10:42:30
【问题描述】:
我尝试动态创建可能具有无法访问节点的图形。这些节点将在创建时转换为新图。然后我将所有图表保存在
MaterialArch 是一个图表
MatArchNode 是一个节点
主图的创建:
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);
}
}
}
我将图表放入地图的功能:
void MaterialPop::add(std::string name, std::shared_ptr<MaterialArch> mat){
std::cout << "ADD : "<<name << std::endl;
bool alreadyExist = false;
for (auto var : m_varMaterials) {
if(var.second == mat){
alreadyExist = true;
}
}
if(!alreadyExist){
m_console->addMatName(name);
m_varMaterials.emplace(name,std::move(mat));
m_views.emplace(name, std::make_shared<MaterialArchView>(m_varMaterials.at(name)));
m_visibility.emplace(name,true);
}
}
我的问题是,一旦我退出 generate(),每个 orph shared_ptr 都是空的。我认为这是因为我尝试访问已删除的对象,但主图是在函数中以相同的方式创建的,并且不是空的。
提前感谢您的帮助
【问题讨论】:
-
嗨,你能提供一些我们可以运行的东西吗?
标签: c++ shared-ptr