模板 class 和派生的 classes
Template class and derived classes
我已经模板化了 MyDatabase
class 和两个派生的 classes Database_A
和 Database_B
。我有另一个使用 Database_A
和 Database_B
的 class C
。因此,每当我在 class C
中包含派生 class(Database_A
和 Database_B
)的 headers 时,它会给我这个错误 "Redefinition of MyDatabase
"。我的猜测是,因为派生的class(Database_A
和Database_B
)都在拖动模板class MyDatabase
,这可能是重新定义[=12的原因=].但是我不知道怎么解决这个问题。
我的代码:
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
};
我该如何解决这个问题?
您应该防止头文件被多重包含。
您可以通过在头文件顶部指定 #pragma once
指令来执行此操作(但我认为这是 Microsoft 特定的)。
更好的方法是用类似于以下的代码包围头文件:
#ifndef MYHEADER_FILENAME
#define MYHEADER_FILENAME
/// whatever contained in your header file
...
#endif // MYHEADER_FILENAME
您似乎有两个头文件,其中每个头文件都包含基础 class 和派生的 class。这就是为什么您会收到重定义错误的原因。
要避免此问题,请执行以下操作:使用三个头文件并包含保护程序。基础 class 将在一个名为 "My_DataBase.h" 的头文件中。其他两个头文件(每个派生一个 class)将包含 "My_DataBase.h".
但是,由于您可能想要包含两个头文件(派生的 classes),您需要使用包含保护来避免重新定义基础 class。
所以这是一个例子:
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);
}
我已经模板化了 MyDatabase
class 和两个派生的 classes Database_A
和 Database_B
。我有另一个使用 Database_A
和 Database_B
的 class C
。因此,每当我在 class C
中包含派生 class(Database_A
和 Database_B
)的 headers 时,它会给我这个错误 "Redefinition of MyDatabase
"。我的猜测是,因为派生的class(Database_A
和Database_B
)都在拖动模板class MyDatabase
,这可能是重新定义[=12的原因=].但是我不知道怎么解决这个问题。
我的代码:
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
};
我该如何解决这个问题?
您应该防止头文件被多重包含。
您可以通过在头文件顶部指定 #pragma once
指令来执行此操作(但我认为这是 Microsoft 特定的)。
更好的方法是用类似于以下的代码包围头文件:
#ifndef MYHEADER_FILENAME
#define MYHEADER_FILENAME
/// whatever contained in your header file
...
#endif // MYHEADER_FILENAME
您似乎有两个头文件,其中每个头文件都包含基础 class 和派生的 class。这就是为什么您会收到重定义错误的原因。
要避免此问题,请执行以下操作:使用三个头文件并包含保护程序。基础 class 将在一个名为 "My_DataBase.h" 的头文件中。其他两个头文件(每个派生一个 class)将包含 "My_DataBase.h".
但是,由于您可能想要包含两个头文件(派生的 classes),您需要使用包含保护来避免重新定义基础 class。
所以这是一个例子:
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);
}