1 2 3 4 5 6 7 8 9 10 11 12 13 | void DisplayObjectContainer::addChild(weak_ptr<DisplayObject> child, int XinParent, int YinParent) { auto pChild = child.lock(); if(pChild) { pChild->Parent(this); //접근못합니다 메렁 displayList.push_back(child); pChild->XY(XinParent, YinParent); } else { DisplayObjectContainerError err(-1); throw err; } } | cs |
DisplayObjectContainer는 DisplayObject를 상속합니다.
DisplayObjectContainer와 DisplayObject는 트리구조를 이룰 수 있는데
DisplayObject는 잎노드라고 볼 수 있습니다.
둘 다
private:
DisplayObject* parent
멤버에 자신의 부모에 대한 포인터를 저장합니다.
(그러니까 DiplayObject에 parent가 private으로 선언되어 있음)
그리고 DisplayObject는 parent의 setter인
protected:
void Parent(DisplayObject* obj){ parent = obj; }
를 가집니다.
DisplayObjectContainer에서 자식을 넣을 때 addChild를 쓰는데
이 함수에서 자식(DisplayObject)의 parent를 설정해줘야됩니다.
Parent(DisplayObject* obj);를 public으로 설정하면 위 함수는 잘 작동합니다....
근데 그러면 어중이떠중이가 접근해서는
DisplayObject의 애미애비를 바꿔버릴수도 있잖아여?
ㅜㅠ
어떻게 해야 될까요?
저의 생각으로는 Parent 는 public 이여야 될꺼 같군효.
그방법밖에 없는거 같긴한데...
이건 뭐 friend 선언이 젤 깔끔해뵌다. 근데 보통은 자식 노드를 shared_ptr로 하고 부모를 weak_ptr로 하지 않나.
차라리 후렌드를 해야겠네여 그리고 private으로 봉쇄해야지
저 트리는 렌더링에만 쓰이는 애들이고 트리는 시스템에 단 하나만 존재함. 자원 관리는 사용자가 알아서 하게 했으요 그래서 자식으로 연결은 weak_ptr 자식에서 부모로는 걍 생포인터. 어떤 노드가 언제 죽을지는 사용자만 알지요
friend 도 별로아닐까요?.. DisplayObjectContainer의 자식이 클래스가 늘어날경우... DisplayObject 클래스에도 friend 선언을 추가해 줘야 될꺼 같은데..
아.. 아니구나 ㅋㅋ