osgStudy4_20.cpp : 定义控制台应用程序的入口点。
节点属性访问器
自定义NodeVisitor并用于节点访问的方法,重构重要的apply()虚函数,在其中打印节点的属性信息(名字和所在库)并通过适当的缩进来表达整个节点树的层次结构。
//InfoVisitor():osg::NodeVisitor(TRAVERSE_ALL_CHILDREN), _indent(0){}
//构造函数初始化列表。C++Primer5 P258
//如果没有在构造函数的初始值列表中显式的初始化成员,则该成员在构造函数体之前执行默认初始化,就是通常的类的构造函数写法。
//但有一些数据成员必须被初始化,例如const,或者引用,当成员属于某种类类型且该类没有定义默认构造函数时,必须将这个成员初始化。
//建议:养成使用构造函数初始值的习惯,能避免一些编译
节点属性访问器
自定义NodeVisitor并用于节点访问的方法,重构重要的apply()虚函数,在其中打印节点的属性信息(名字和所在库)并通过适当的缩进来表达整个节点树的层次结构。
访问器Visitor,使用典型的对象行为模式,它可以向不同的节点,施加用户自定义的操作,将这些操作整合到一个对象中,同时避免这些操作可能造成的数据结构本身的变化,从而实现了一种更加自由的编码方式。
每个数据元素节点都可以通过accept()方法调用访问器,访问器通过apply()方法获取传入的节点对象,并执行所需的节点操作。
osg::NodeVisitor只是访问器角色的抽象接口。我认为这里的接口不是C++标准定义的接口,查看了源码,在NodeVisitor中定义的是不同节点的apply虚函数,用于用户自定义的Visitor子类的重写,不是纯虚函数,这里书中叫做接口,应该是为了理解吧。
//——C++构造函数初始值列表————//InfoVisitor():osg::NodeVisitor(TRAVERSE_ALL_CHILDREN), _indent(0){}
//构造函数初始化列表。C++Primer5 P258
//如果没有在构造函数的初始值列表中显式的初始化成员,则该成员在构造函数体之前执行默认初始化,就是通常的类的构造函数写法。
//但有一些数据成员必须被初始化,例如const,或者引用,当成员属于某种类类型且该类没有定义默认构造函数时,必须将这个成员初始化。
//建议:养成使用构造函数初始值的习惯,能避免一些编译