2016-09-27 2 views
2

모든 클래스에 대해 'class name' does not name a type 오류가 발생합니다. 순환 의존성이 있다고 의심하지만 각 클래스가 다음 클래스의 함수에 액세스해야하므로 해결 방법이 없습니다. 다음은 내 클래스는 다음과 같습니다"형식 이름을 지정하지 않습니다"오류를 해결하는 방법

Container.h :

#ifndef CONTAINER_H 
#define CONTAINER_H 

#include "Factory.h" 

class Container 
{ 
public: 
    Container() 
    { 
     array = new int[10]; 
     for (int i = 0; i < 10; ++i) { 
      array[i] = i; 
     } 
    } 
    Iterator* createIterator() 
    { 
     Factory fac; 
     return fac.factoryMethod(); 
    } 
    friend class Iterator; 

private: 
    int* array; 
}; 

#endif //CONTAINER_H 

Factory.h :

#ifndef FACTORY_H 
#define FACTORY_H 

#include "Iterator.h"; 

class Factory 
{ 
    Iterator* factoryMethod(Container* con) 
    { 
     return new Iterator(con); 
    } 
}; 

#endif //FACTORY_H 

Iterator.h :

#ifndef ITERATOR_H 
#define ITERATOR_H 

#include "Container.h" 

class Iterator 
{ 
public: 
    Iterator(Container* con) 
    { 
     this->con =con; 
    } 
    int getFromIndex(int i) 
    { 
     return con->array[i]; 
    } 
private: 
    Container* con; 
}; 

#endif //ITERATOR_H 

MAIN.CPP :

#include <iostream> 
using namespace std; 

#include "Container.h" 
#include "Iterator.h" 

int main() { 
    Container con; 
    Iterator* it = con.createIterator(); 
    cout<<it->getFromIndex(2)<<endl; 

    return 0; 
} 

도움을 주셔서 감사합니다.

+2

.cpp 파일에 함수 본문을 넣습니다. – Dan

+0

@ 단 이걸 시도했지만 데모 목적으로 만 인라인으로 넣으십시오. – Keagansed

답변

6

실제로 헤더 간의 순환 의존성입니다. Container.hFactory.h을 포함하며 Iterator.h을 포함하며 Container.h을 포함합니다.

해결 방법은 멤버 함수의 구현을 헤더 파일에서 소스 파일로 옮기는 것입니다. 그 방법은, 헤더 파일은 쉽게 "소모"헤더 파일에 직접 넣을 수있는 클래스의 선언이 아니라 정의가 필요합니다 :

class Iterator; 

class Container 
{ 
public: 
    Container(); 
    Iterator* createIterator(); 
    friend class Iterator; 

private: 
    int* array; 
}; 

을 그리고, 적절한 소스 파일 (예 : Container.cpp를 등) 쿠르의, FactoryIterator에 대한 Container.cpp에게

#include "Container.h" 
#include "Factory.h" 

Container::Container() : array(new int[10]) 
{ 
    for (int i = 0; i < 10; ++i) { 
     array[i] = i; 
    } 
} 

Iterator* Container::createIterator() 
{ 
    Factory fac; 
    return fac.factoryMethod(); 
} 

(Dtto을

: 멤버 함수를 구현하고 당신이 필요로하는 헤더를 포함 se).

최종 바이너리를 빌드 할 때 모든 소스 파일을 함께 연결하는 것을 잊지 마십시오.

+0

도움을 주셔서 감사합니다. – Keagansed

1

Dan이 말했듯이, 기능 본문을 .cpp 파일 (다른 번역 단위)에 넣으십시오.

또한 유형에 대한 포인터 만 사용하는 경우 #include이 필요하지 않습니다. 그냥 앞으로 선언하십시오.

+0

감사합니다. – Keagansed