我有MyDatabase
类和两个派生类Database_A
和Database_B
。我有另一个使用C
和Database_A
的课程Database_B
。因此,每当我在类Database_A
中包含派生类(Database_B
和C
)的标头时,它都会给我这个错误“重新定义MyDatabase
”。我的猜测是,因为派生类(Database_A
和Database_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
};
我该如何解决这个问题?
答案 0 :(得分:2)
好像你有两个头文件,其中每个头文件包含基类和一个dereived类。这就是你得到重新定义错误的原因。
要避免此问题,请执行以下操作:使用三个头文件并包含警卫。基类将在一个头文件中,名为&#34; My_DataBase.h&#34;。另外两个头文件(每个dereived类一个)将包含&#34; My_DataBase.h&#34;。
但是,由于您可能希望包含(派生类的)两个头文件,因此需要使用包含保护来避免重新定义基类。
所以这是一个例子:
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 :(得分:1)
您应该阻止多个包含的头文件。
您可以通过在头文件顶部指定#pragma once
指令来执行此操作(但我认为这是Microsoft特定的)。
更好的方法是使用类似于以下内容的代码来包围头文件:
#ifndef MYHEADER_FILENAME
#define MYHEADER_FILENAME
/// whatever contained in your header file
...
#endif // MYHEADER_FILENAME