2011-12-13 2 views
2

시뮬레이션 프로그램을 설정하려고합니다. 시뮬레이션은 여러 단계로 실행되며 시뮬레이션 클래스는 여러 클래스의 :: step()을 호출해야하며, 그 중 하나는 _experiment 클래스입니다.순환 종속 클래스의 멤버 호출 방법

나는 실험 클래스는 시뮬레이션 클래스를 필요로하고 시뮬레이션 클래스는 실험 클래스가 무엇인지 알 필요가 있기 때문에이이 동작하지 않습니다, 그래서 그들은 따라 순환한다. 나는 forward 선언문을 사용하여 그것을 해결하려고 노력했지만, 앞으로 선언 된 클래스의 메소드에 접근 할 수 없다. 그렇다면 앞으로 선언 할 시점은 무엇입니까? 누구든지 나를 도울 수 있습니까? 감사!

MAIN.CPP

int main() 
{ 
    _experiment experiment; 
} 

experiment.cpp :

#include "experiment.h" 

_experiment::experiment() 
{ 
    _simulation simulation; 
    simulation.experiment = this; 
    simulation.start(); 
} 

void _experiment::step() 
{ 
    //Apply forces to simulation 
} 

experiment.h :

#include "simulation.h" 

class _experiment { 
public: 
    void step() 
}; 

simulation.cpp :

#include "simulation.h" 

void _simulation::run() 
{ 
    //Run simulation for 1000 steps 
    for(int i = 0; i < 1000; i++) 
    { 
     experiment->step() //Calculate forces. Doesnt work (cant use member functions of forward declared classes. How to work around this? 

     //Calculate motion 
    } 
} 
,

simulation.h :

class _experiment; //Forward declaration 

class _simulation { 
public: 
    _experiment* experiment 
    void run(); 
}; 

답변

0

experiment.h_simulation를 선언 simulation.h을 포함하거나 전달할 필요가 없습니다.

당신은 이미 전체 정의를 필요로하지 않는다, _simulation의 정의 _experiment에 대한 포인터를 포함하고 있기 때문에, 좋은 simulation.h에서 앞으로 선언이나 _experiment을 보유하고 있습니다.

누락 된 부분은 소스 파일에있는 두 클래스의 정의입니다. 클래스 정의가 필요하므로 두 소스 파일의 두 헤더를 모두 포함해야하며 모든 것이 좋아야합니다. 일반적으로

, 당신은 당신이 소스 파일에 필요하고 당신이 다음 주로 순환 종속성 문제를 방지거야, 앞으로 선언보다 더 필요한 경우에만 다른 헤더에서 헤더를 포함하는 모든 헤더를 포함합니다. 다른 헤더에서 헤더를 포함해야 할 경우도 추가해야합니다

그 경우에 여러 정의를 방지하기 위해 헤더에 경비가 포함되어 있습니다.

다음 선언 앞으로의 점은 무엇인가?

이 클래스를 사용하면 다른 클래스를 선언 할 필요없이 클래스가 있다고 선언 할 수 있습니다. 클래스에 대한 포인터 또는 참조 정의와 같은 몇 가지 유용한 작업을 수행하거나 클래스가있는 인수로 함수를 선언하거나 전달 선언으로 만 리턴 유형을 선언 할 수 있습니다.당신은 단지 클래스의 크기 나 멤버에 대한 지식이 필요한 것을 할 수 없습니다.

+0

따라서 헤더에 헤더가 사용하는 모든 것을 cpp가 사용하는 모든 것을 선언/포함해야합니다. "experiment.h"를 "experiment.cpp"에 포함시키고 "experiment.h"에 #include "simulation.h"를 쓰면 "simulation.h"가 "experiment.cpp"에 포함될 것이라고 생각했습니다. 역시. 나는 당신이 말했듯이 해냈어. 지금은 고마워! – user1092682

+0

하나의 헤더가 다른 헤더에 의존한다는 지식에 의존하기보다는 소스가 필요한 모든 것을 포함하는 것이 가장 좋습니다. 그 종속성은 미래에 변할 수 있으며 꼭 필요한 경우가 아니라면 헤더가 다른 헤더를 포함하지 않는 것이 가장 좋습니다. –

0

당신은 simulation.cpp에서 _experiment의 정의를하지 않아도은 소스 파일의 experiment.h 파일을 포함하고 모든 작업을해야합니다.

또한 _experiment 클래스는 예제에서 _simulation을 사용하지 않으므로 experiment.h에 simulation.h를 포함 할 필요가 없습니다. 또한 include guards을 헤더 파일에 추가하십시오. _experiment의 정의는 모든 _simulation에 의존하지 않기 때문에

관련 문제