OpenMesh属性管理器疑问:属性初始化与跨函数访问问题
OpenMesh命名属性相关问题解答
问题1:执行auto GroupMark = FProp<bool>(*this, "shellGroupMark");时,属性会被初始化吗?
分两种场景判断:
- 属性未存在时:这行代码会为网格创建新的面命名属性,同时自动对所有面的属性值做默认初始化——bool类型默认设为
false,数值类型设为0,自定义类型会调用其默认构造函数。 - 属性已存在时:这行代码只是将
GroupMark绑定到已有的属性上,不会修改任何现有属性值,仅作为属性的访问入口。
注:这里的FProp应该是OpenMesh PropertyManager的封装(针对面属性的简化typedef),本质是属性的访问代理,行为完全依赖底层属性是否已创建。
问题2:someFuncA未结束时,someFuncB为何无法使用GroupMark?
你的代码存在两个关键问题:
- 局部变量作用域限制:
GroupMark是someFuncA中的局部变量,仅在someFuncA的代码块内可见,someFuncB作为独立函数根本无法直接访问这个变量。另外你代码里写的shellGroupMark是未定义的变量(和GroupMark名字不一致,应该是笔误)。 - 属性访问必须显式绑定:哪怕命名属性已经存在于网格中,你也必须在
someFuncB里通过FProp(即PropertyManager)重新绑定到该属性,才能读写属性值。你注释掉的auto GroupMark = FProp<bool>(*this, "shellGroupMark");其实就是正确做法——这行代码不会重复创建属性,只是获取已存在属性的访问权限。
修正示例
你可以选择两种方式解决:
方式1:在someFuncB中重新绑定属性
bool someFuncB(const SmartFaceHandle& startFace) { auto GroupMark = FProp<bool>(*this, "shellGroupMark"); // 绑定已存在的属性 for(const SmartFaceHandle& face : faces()) { GroupMark[face] = true; } return true; }
方式2:将属性访问器作为参数传递
// 修改someFuncB的参数 bool someFuncB(const SmartFaceHandle& startFace, FProp<bool>& GroupMark) { for(const SmartFaceHandle& face : faces()) { GroupMark[face] = true; } return true; } // 在someFuncA中调用 if(someFuncB(face, GroupMark)) { // 执行你的操作 }
内容的提问来源于stack exchange,提问作者asdbvvc
相关产品推荐
相关产品推荐

