2011-09-20 4 views
0

부모님/자식 관계를 만드는 데 문제가 있습니다. 이 방법을 설명 할 수있는 가장 쉬운 방법은 동일한 유형의 다른 객체에 대한 참조 (또는 포인터)를 가진 객체와 더 많은 객체에 대한 자식 참조 (또는 포인터)의 배열을 가지는 것입니다. 개체에는 .getChildren, .addChild, .removeChild, .getParent, .changeParent와 같은 기능이 있어야합니다. 포인터에 대해 끔찍한 시간을 보냈습니다. 누구든지 코드가 도움이된다면 도움이 될 것입니다. 또한 호기심이 생길 경우 3D 모델에서이 접근법을 사용할 것입니다. 기본 모델 (부모)은 객체의 중심이 될 것이고 모든 자식은 자유롭게 이동할 수 있으며 부모가 움직이면 자식이 움직입니다.개체와 부모/자식 관계 만들기

코드 :

class Base { 
    protected: 
    Base* parent; 
    std::vector<Base*> children; 

    std::string id; 

    POINT pos, rot; 
    public: 
    Base (void); 
    Base (std::string); 
    Base (POINT, POINT, std::string); 
    Base (const Base&); 
    ~Base (void); 

    POINT getPos (void); 
    POINT getRot (void); 

    Base getParent (void); 
    Base getChildren (void); 

    void addChild (Base&); 
    void removeChild (Base&); 
    void changeParent (Base); 

    void move (int, int); 
    void rotate (int, int); 

    void collide (Base); 
    void render (void); 
}; 

Base::Base (void) { 
    this->id = getRandomId(); 
    this->pos.x = 0; this->pos.y = 0; this->pos.z = 0; 
    this->rot.x = 0; this->rot.y = 0; this->rot.z = 0; 
}; 

Base::Base (std::string str) { 
    this->id = str; 
    this->pos.x = 0; this->pos.y = 0; this->pos.z = 0; 
    this->rot.x = 0; this->rot.y = 0; this->rot.z = 0; 
}; 

Base::Base (POINT p, POINT r, std::string str) { 
    this->id = str; 
    this->pos = p; 
    this->rot = r; 
}; 

Base::Base (const Base& tocopy) { 
    this->parent = tocopy.parent; 
    this->children = tocopy.children; 
    this->id = tocopy.id; 
    this->pos = tocopy.pos; 
    this->rot = tocopy.rot; 
}; 

Base::~Base (void) { 
}; 

void Base::changeParent (Base child) { 
    *(this->parent) = child; 
}; 

int main (void) { 
    POINT p; 
    p.x=0;p.y=0;p.z=3; 
    Base A; 
    Base B(p, p, "Unique"); 
    printf("A.pos.z is %d and B.pos.z is %d\n", A.getPos().z, B.getPos().z); 
    B.changeParent(A); 
    printf("B.parent.pos.z %d should equal 0\n", B.parent->getPos().z); 

나는 코드를 얻을 오류가 있습니다 : 오류 C2248 : '자료 : 부모', 또한 클래스 '자료'에 을 선언 보호 된 멤버에 액세스 할 수 없습니다 나는 모든 것을 공개 할 경우 , 그것은 잘 컴파일 될 것이지만, 그 다음에는 실행 중에 충돌합니다.

참고 : 모든 코드를 복사하지 않았으며 관련성이 있다고 생각합니다.

편집 : 오류의 전체 덤프 :

(152) : error C2248: 'Base::parent' : cannot access protected member declared in class 'Base' 
    (20) : see declaration of 'Base::parent' 
    (18) : see declaration of 'Base' 
+0

오류가 도움이에서 오는 라인을 반환해야 함을 유의하십시오. 또한 모든 this-> stuff 대신 생성자에 대해 [초기화 목록] (http://www.cprogramming.com/tutorial/initialization-lists-c++.html)을 사용해야합니다. 그러면 복사본이 저장됩니다. –

+0

덤프가있는 수정 된 게시물. 나는 그것들을 이해하지 못한다. 나는 그저 오래 전에 그렇게 읽은 사람들에 대해 읽었으므로 나는 아직 그것에 대해 걱정하지 않는다. – Hondros

+0

또한, "public"으로 변경했지만 런타임시 충돌이 발생하면 컴파일 할 것이므로 실제로 언어가 잘못되어 있다고 생각하지 않습니다. – Hondros

답변

0

printf("B.parent.pos.z %d should equal 0\n", B.parent->getPos() 

당신은 외부에서 B.parent을 참조하기 위해 노력하고 있기 때문에이

protected: 
    Base* parent; 

의 당신의 오류가 발생합니다 클래스 구현 parentprotected으로 선언되어 있으므로 사용할 수 없습니다. 당신이 오류가있는 라인 알려 경우 항상 도움이

public: 
    inline Base* getParent() { return parent; } 
+0

당신은 재미있어. 실제로이 코드는 코드에 정의되어 있었고 사용하는 것을 잊어 버렸습니다. 감사. 편집 : 불행히도, 그것은 여전히 ​​시작에 충돌. 한 가지 문제를 해결해 주셔서 감사합니다.하지만 지금해야 할 일은 무엇입니까? – Hondros

+0

불쾌감은 없지만 포인터를 사용하면 지저분 해지고 잠시 동안 예상치 못한 충돌이나 충돌로 이어질 가능성이 있습니다. 여기에서 모든 문제를 분석하는 것은 어렵습니다. 그러나 다음으로 가장 당면한 문제는'changeParent'에서'* (this-> parent) = child'이다. 여기에서는 결코 초기화되지 않은 포인터 ('parent')를 역 참조하고, 무언가를 할당하여 거의 항상 충돌을 일으킬 것입니다. 최소한 this-> parent = & child'를 원하지만, 코드를 철저히 검토하는 것이 훨씬 더 좋다. – adpalumbo

0

: Base 당신의 선언, 당신은 같은 부모를 반환하고 공개 접근 기능을 추가해야합니다. 이 줄을 언급했다면 지금까지 10 개의 답을 얻을 수 있습니다.

printf("B.parent.pos.z %d should equal 0\n", B.parent->getPos().z); 

int main()

Base의 보호 된 멤버에 액세스 할 수 없습니다, 따라서 B.parent에 액세스 할 수 없습니다. 이것을 바꾸기 :
printf("B.getParent().pos.z %d should equal 0\n", B.getParent()->getPos().z); 

http://ideone.com/CobdS

는 또한 getParent() 아마 포인터 ( Base*)을 반환해야하고, getChildren() 아마 const std::vector<Base*>&

+0

편집 내용을 보면 라인이 표시되고 이미 답변을했습니다. 그래도 감사합니다. 또한,이 런타임 오류를 해결하지 않지만이 코드를 그냥 폐기입니다. – Hondros

+0

그래, 그렇게 해. 이 방법으로 움직이는 점은 실제로 불행히도 매우 느립니다. –