2017-09-21 3 views
2

MyDatabase 클래스와 파생 클래스 Database_ADatabase_B의 템플릿이 두 개 있습니다. 다른 클래스 CDatabase_ADatabase_B을 사용하고 있습니다. 따라서, 클래스 C에 두 파생 클래스 (Database_ADatabase_B)의 헤더를 포함 할 때마다이 메시지는 "Redefinition of MyDatabase"오류입니다. 내 추측은 두 파생 클래스 (Database_ADatabase_B)가 템플릿 클래스 MyDatabase을 끌기 때문에 MyDatabase의 재정의 이유가 될 수 있습니다. 하지만이 문제를 해결하는 방법을 모르겠습니다.템플릿 클래스 및 파생 클래스

내 코드 :

template <typename U, class T> class My_DataBase { 
    protected: 
    std::map<U,T> Container 
    public: 
    void add(); 
    T* getNameToPointer(string key); 
}; 

class Database_A: public My_Database <string,A> { 
    add(); 
    A* getNameToPointer(name); 
}; 

class Database_B: public My_DataBase <string,B> { 
    add(); 
    B* getNameToPointer(name); 
}; 

class C { 
    private: 
    Database_A Db_A; // drage template class on back_end 
    Database_B Db_B; // drage template class on back_end 
}; 

가 어떻게이 문제를 해결할 수 있습니까?

+2

우리에게 완전한 최소한의 예를 보여

My_DataBase.h : 그래서 여기

은 예입니다. 그리고 이것은 C가 아닙니다, 이것은 C++입니다. – gsamaras

+0

간단한 설명은 템플릿 클래스 A와 2 개의 파생 클래스 B와 C가 있습니다. 이제는 클래스 B와 C를 모두 사용하는 또 다른 클래스 D가 생겼습니다. D에서 B & C의 헤더 파일을 포함 할 때마다 나 클래스 A의 재정의 오류. 그래서이 문제를 피하는 방법 ??? –

+0

헤더 파일로 질문을 업데이트 해주셔서 감사합니다. – gsamaras

답변

2

보인다. 그래서 재 정의 오류가 발생합니다.

이 문제를 방지하려면 다음과 같이하십시오. 세 개의 헤더 파일을 사용하고 경비원을 포함하십시오. 기본 클래스는 "My_DataBase.h"라는 하나의 헤더 파일에 있습니다. 두 개의 다른 헤더 파일 (모든 분리 된 클래스에 하나씩)에는 "My_DataBase.h"가 포함됩니다.

그러나 파생 클래스의 두 헤더 파일을 모두 포함하려는 경우 기본 도형의 재정의를 피하기 위해 포함 가드를 사용해야합니다.

#ifndef MY_DATABASE_H 
#define MY_DATABASE_H 
template <typename U, class T> class My_DataBase { 
protected: 
std::map<U,T> Container 
public: 
void add(); 
T* getNameToPointer(string key); 
} 
#endif 

Database_A.h

#ifndef DATABASE_A_H 
#define DATABASE_A_H 

#include "My_DataBase.h" 

class Database_A: public My_Database <string,A> { 
add(); 
A* getNameToPointer(name); 
} 

Database_B.h이

#ifndef DATABASE_B_H 
#define DATABASE_B_H 

#include "My_DataBase.h" 

class Database_B:public My_DataBase <string,B> { 
    add(); 
    B* getNameToPointer(name); 
} 
1

여러 헤더 파일이 포함되지 않도록해야합니다. #pragma once 명령을 헤더 파일의 맨 위에 지정하여이 작업을 수행 할 수 있습니다 (단, Microsoft에만 해당). 더 좋은 방법은 다음과 비슷한 코드로 헤더 파일을 포위하는 것입니다 : 각 헤더 파일은 기본 클래스와 dereived 클래스를 포함하는 두 개의 헤더 파일을 가지고있는 것처럼

#ifndef MYHEADER_FILENAME 
#define MYHEADER_FILENAME 
/// whatever contained in your header file 
... 
#endif // MYHEADER_FILENAME 
+0

'#pragma once'는 기술적으로 컴파일러마다 다르지만 실제로는 거의 모든 컴파일러에서 작동합니다. Visual Studio, GCC, Clang. –

+0

이제 완벽하게 감사합니다 !!! –

관련 문제