Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 场景图子节点注册&;复制构造函数_C++_Constructor_Copy_Scenegraph - Fatal编程技术网

C++ 场景图子节点注册&;复制构造函数

C++ 场景图子节点注册&;复制构造函数,c++,constructor,copy,scenegraph,C++,Constructor,Copy,Scenegraph,我有一个场景图,所有节点都来自一个基类AbstractNodeAbstractNode具有registerChild成员函数: registerChild<T>(string name, shared_ptr<AbstractNode> * childMember) registerChild(字符串名,共享\ptr*childMember) 用于以标准方式注册子级(以便可以在基类接口中列出和修改它们)。它基本上是将name/child\u指针对添加到散列中 例如,类

我有一个场景图,所有节点都来自一个基类
AbstractNode
AbstractNode
具有
registerChild
成员函数:

registerChild<T>(string name, shared_ptr<AbstractNode> * childMember)
registerChild(字符串名,共享\ptr*childMember)
用于以标准方式注册子级(以便可以在基类接口中列出和修改它们)。它基本上是将name/child\u指针对添加到散列中

例如,类材料将被声明为(缩写):

类材料:公共抽象节点
{
公众:
材质(){registerChild(&color);}
私人:
std_共享颜色;
}
颜色是AbstractNode的另一个子类

现在我想为AbstractNode实现一个复制构造函数。它必须复制已注册子项的列表,并更新子成员指针。我希望避免在所有基类中重新实现复制构造函数。这可能吗

我曾经考虑过处理
这个
和子指针之间的指针偏移量。但是,在两个实例之间,它们是否保证是常数?这对我来说似乎是个大难题。。。(我甚至可以肯定,当子类化时,这并不能保证)

谢谢


Etienne

抽象节点*共享的\u ptr
到底意味着什么?什么都没有。这是固定的…我有一个解决办法:将所有“registerChild”调用从派生类构造函数移动到“registerAll”虚拟函数。然后在第一次调用children访问函数时调用这个函数。不是很完美,但很有效。如果您想在复制时更新指针表,而不要求派生类作者编写更多代码,我们将不胜感激!
shared\ptr*childMember
的目的是什么?指向
std::shared_ptr
的指针????!是的,或者简单地说,是一个双指针抽象节点**,但在一个阶段共享。指向指针的指针通常用于修改指向的对象。你从来没有用过双指针????!您从未使用共享指针来避免内存泄漏和指针悬空????!
class Material : public AbstractNode
{
public:
    Material() { registerChild(&color); } 

private:
    std_shared<Color> color;
}