模板类和派生类

时间:2017-09-21 09:01:12

标签: c++ class oop templates header-files

我有MyDatabase类和两个派生类Database_ADatabase_B。我有另一个使用CDatabase_A的课程Database_B。因此,每当我在类Database_A中包含派生类(Database_BC)的标头时,它都会给我这个错误“重新定义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 个答案:

答案 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