2017-10-13 21 views
0

순환 의존성을 피하기 위해 다른 클래스의 선언 클래스 변수를 전달할 수 있습니까? 예 :클래스 변수의 전방 선언

//another file 
class Engine; 
extern vector<Block*> Engine::MapBlocks; 

//Engine.h 
class Engine 
{ 
public: 
    vector<Block*> MapBlocks; 
}; 

가능한가요?

+1

Nope가 작동하지 않습니다. – CoryKramer

+0

C++에는 부분 클래스가 없습니다. – Ron

답변

0

아니요, 시도하려는 작업을 수행 할 수 없습니다. 비 정적 클래스 멤버를 클래스 정의 외부에서 선언 할 수는 없습니다. 그러한 일이 허용되면 모든 코드가 임의의 클래스를 임의로 수정할 수 있습니다 (예 : 실제로 클래스의 일부가 아닌 멤버를 선언함으로써). 논리적으로는 클래스 (예 : 캡슐화)를 완전히 사용하려는 의도가 없습니다.

그러나 정의가 표시되지 않은 채 클래스 유형에 대한 포인터를 전달하고 저장할 수 있습니다. 컴파일러는 컨테이너에 포인터를 저장하기 위해 Block의 정의의 가시성을 확보 할 필요가 없기 때문에이 경우

#include <vector>  // necessary for use of std::vector 

class Block; 

class Engine 
{ 
    public: 
    std::vector<Block*> MapBlocks; 

     // preferably declare constructors and/or other member functions 
     // that initialise MapBlocks appropriately to needs 
}; 

이 작동합니다. 당연히

그 멤버 함수 Block (예컨대 some_engine.MapBlocks.push_back(new Block))를 인스턴스화 또는 통화 시도하는 코드 (예 some_engine.MapBlocks[some_valid_index]->some_member_function())는 클래스 Block의 정의뿐만 아니라 순방향 선언의 시야에 의존한다.

3

없음

귀하의 클래스 선언이 완료되어야합니다, 당신은 그것을 분할하거나 부분적으로 선언 할 수 없습니다.

실제 문제에 관해서 질문하신 경우, 어쨌든 도움을 드릴 수 있습니다. 가장 가능성이있는 해결책은이 추상적 인 질문이 아닌 것입니다.