2013-02-05 1 views
3

기본 엔티티/개체 관리 시스템을 설정하려고하는데 두 클래스가 있습니다. 하나는 상속 할 엔터티의 기본 클래스이고 다른 하나는 관리하고 제어하는 ​​클래스입니다. 순환 의존성이있는 C++ 클래스는 어떻게 정의합니까?

내가 사용하려고 해요 소스 코드입니다

#include <iostream> 
#define MAX_ENTS 400 
class EFentity; 
class EFiterator; 
class EFentity { 
    public: 
      EFentity(); 
      virtual bool step(); 
      virtual void create(EFiterator*,int); 
      virtual void destroy(); 
    private: 
      int holder_id; 
      EFiterator* holder; 
}; 
EFentity::EFentity(void) { 
    // add base entity stuff 
} 
void EFentity::destroy() { 
    holder->ents[holder_id]=NULL; 
    std::cout << "destroying object id "<<holder_id; 
    delete this; 
} 
void EFentity::create(EFiterator* h,int pos) { 
    holder=h; 
    holder_id=pos; 
} 
bool EFentity::step() { 
    return false; 
} 
class EFiterator { 
public: 
    EFentity* ents[MAX_ENTS]; 
    int e_size; 
    EFiterator(); 
    void push(EFentity* e); 
    void update(); 
}; 
EFiterator::EFiterator() { 
    e_size=0; 
} 
void EFiterator::update() { 
    for(int i=0;i<e_size;i++) { 
      if (!ents[i]->step()) { 
       std::cout << "entity id "<< i<<" generated a fault!\n"; 
      } else std::cout << "entity id "<<i<<" passed step test.\n"; 
    } 
} 
void EFiterator::push(EFentity* e) { 
    ents[e_size]=e; 
    e->create(this,e_size++); 
} 
int main() { 
    EFiterator main_iterator; 
    main_iterator.push(new EFentity()); 
    main_iterator.update(); 
    std::cin.get(); 
    return 0; 
} 

분명히이 컴파일되지 않습니다이 코드를 여기에 오류가 있습니다 :

In member function `virtual void EFentity::destroy()': 

[20] invalid use of undefined type `struct EFiterator' 
[5] forward declaration of `struct EFiterator' 

내가 본 문제 그래서 전에는 이런 식 이었지만 다른 클래스의 멤버 변수와 함수에 액세스 할 필요가 없으므로 포인터로 쉽게 해결할 수있었습니다.

나는이 생각 EFiterator의 내부 배열에 액세스 할 수있는 프로토 타입 기능을함으로써 해결 될 수 있지만, 일부 까다로운 수준의 조작을 원활하게 할 수있는 방법이 있나요? 이 문제를 해결해야 EFiterator 정의 후 EFentity::destroy()을 넣어

holder->ents[holder_id]=NULL; 

를 호출 할 때

답변