OSG 학습 노트 2 - 노드 속성 접근 기
노드 속성 접근 기
NodeVisitor 를 사용자 정의 하고 노드 접근 에 사용 하 는 방법 으로 중요 한 apply () 가상 함 수 를 재 구성 합 니 다. 그 중에서 노드 의 속성 정보 (이름과 소재 라 이브 러 리) 를 인쇄 하고 적당 한 들 여 쓰기 를 통 해 전체 노드 트 리 의 차원 구 조 를 표현 합 니 다.
방문 기 Visitor 는 전형 적 인 대상 행위 모델 을 사용 하여 서로 다른 노드 에 사용자 정의 조작 을 가 할 수 있 습 니 다. 이 조작 을 한 대상 에 통합 시 키 는 동시에 이러한 조작 으로 인해 발생 할 수 있 는 데이터 구조 자체 의 변 화 를 피 함으로써 더욱 자유로운 인 코딩 방식 을 실현 할 수 있 습 니 다.
모든 데이터 요소 노드 는 accept () 방법 으로 액세스 기 를 호출 할 수 있 습 니 다. 액세스 기 는 apply () 방법 으로 들 어 오 는 노드 대상 을 가 져 오고 필요 한 노드 작업 을 수행 할 수 있 습 니 다.
osg:: NodeVisitor 는 방문 자 역할 의 추상 적 인 인터페이스 일 뿐 입 니 다.여기 인 터 페 이 스 는 C + + 표준 정의 인터페이스 가 아니 라 소스 코드 를 보 았 습 니 다. NodeVisitor 에서 서로 다른 노드 의 apply 가상 함 수 를 정의 합 니 다. 사용자 정의 Visitor 하위 클래스 의 재 작성 에 사용 되 는 것 은 순 허 함수 가 아 닙 니 다. 여기 책 은 인터페이스 라 고 하 는데 이해 하기 위해 서 입 니 다. / -C + 구조 함수 초기 값 목록 -
//InfoVisitor():osg::NodeVisitor(TRAVERSE_ALL_CHILDREN), _indent(0){}
/ / 구조 함수 초기 화 목록.C++Primer5 P258
/ / 구조 함수 의 초기 값 목록 에서 명시 적 초기 화 구성원 이 없 으 면 이 구성원 은 구조 함수 체 를 만 들 기 전에 기본 초기 화 를 실행 하 는 것 이 일반적인 구조 함수 쓰기 입 니 다.
/ / 그러나 일부 데이터 구성원 은 초기 화 되 어야 합 니 다. 예 를 들 어 const 나 참조, 구성원 이 특정한 종류 에 속 하고 이 클래스 가 기본 구조 함 수 를 정의 하지 않 았 을 때 이 구성원 을 초기 화 해 야 합 니 다.
/ / 제안: 구조 함수 의 초기 값 을 사용 하 는 습관 을 기 르 면 컴 파일 오 류 를 피 할 수 있 습 니 다.
/ / 구조 함수 이름 InfoVisitor () 뒤의 ":" 뒤에 두 개의 초기 화 값 이 있 고 쉼표 로 구분 합 니 다.이전 에는 InfoVisitor 라 는 클래스 가 NodeVisitor 를 물 려 받 았 기 때 문 일 것 입 니 다.
/ / 여기 서 동시에 부 류 를 초기 화 합 니 다.두 번 째 는indent 를 0 으로 초기 화 합 니 다.
/ / - C + + 인터페이스 --
다른 시스템 과 상호작용 하 는 방법 을 제공 하고 모든 하위 클래스 에 접근 인 터 페 이 스 를 공동으로 약정 합 니 다. 클래스 밖에서 사용 하 는 인 터 페 이 스 는 일반적으로 순수한 가상 함 수 를 사용 합 니 다. 예 를 들 어 virtual void work () = 0;
인터페이스 실현: 인 터 페 이 스 를 계승 하 는 하위 클래스 를 통 해 서로 다른 하위 클래스 는 서로 다른 효 과 를 실현 할 수 있다. 이것 이 바로 다 형 이다.
/ - C + + 허 함수 - - / 기 류 는 유형 과 관련 된 함수 와 파생 류 를 바 꾸 지 않 고 직접 계승 하 는 함수 와 구별 합 니 다.일부 함수 에 대해 기본 클래스 는 파생 클래스 가 자신 에 게 맞 는 버 전 을 사용자 정의 하 기 를 바 랍 니 다. 이때
/ / 기본 클래스 는 이 함수 들 을 가상 함수 virtual 로 설명 합 니 다. 즉, 설명 은 덮어 쓸 수 있 습 니 다.하위 클래스 의 두 apply 는 부 류 를 재 구성 하 는 방법 이다.
/ / C + + 는 한 구성원 함수 가 가상 함수 로 밝 혀 지면 파생 클래스 의 동명 함수 가 자동 으로 가상 함수 가 되 므 로 하위 클래스 가 이 가상 함 수 를 다시 설명 할 때 virtual 키 워드 를 추가 할 수도 있 고 추가 하지 않 아 도 되 지만 더 하면 프로그램 차원 이 더욱 뚜렷 해 집 니 다.
#include "stdafx.h"
#include<osg/Node>
#include<osgDB/ReadFile>
#include<iostream>
class InfoVisitor :public osg::NodeVisitor{//Step1:
public:
InfoVisitor()
:osg::NodeVisitor(TRAVERSE_ALL_CHILDREN), _indent(0){}
virtual void apply(osg::Node& node)//Step2: apply() , 。
{
for (int i = 0; i < _indent; ++i) std::cout << " ";
std::cout << "[" << _indent + 1 << "]" << node.libraryName() << "::" << node.className() << std::endl;
_indent++;
traverse(node);
_indent--;
}
virtual void apply(osg::Geode& node)
{
for (int i = 0; i < _indent; ++i) std::cout << " ";
std::cout << "[" << _indent + 1 << "]" << node.libraryName() << "::" << node.className() << std::endl;
for (unsigned int n = 0; n < node.getNumDrawables(); ++n)
{
osg::Drawable*drawable = node.getDrawable(n);
if (!drawable)continue;
for (int i = 0; i <= _indent; ++i)std::cout << " ";
std::cout << drawable->libraryName() << "::" << drawable->className() << std::endl;
}
_indent++;
traverse(node);
_indent--;
}
protected:
int _indent;
};
int _tmain(int argc, char** argv)
{
osg::ArgumentParser arugments(&argc, argv);
osg::Node* root = osgDB::readNodeFiles(arugments);
if (!root) root = osgDB::readNodeFile("axes.osgt");
InfoVisitor infoVisitor;
if (root)root->accept(infoVisitor);//Step3: , accept() apply()
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.