继承和例外

时间:2015-12-14 22:15:07

标签: c++ inheritance data-structures default-constructor

我有几个继承类,但我不知道如何为它创建一个默认构造函数,map事实是一个包含ID名称的地图和其他用于口袋妖怪的东西

class Pokemon {
public:
     Pokemon(){}
     Pokemon(std::map<std::string, std::vector<std::string> > &facts);
protected:
     std::map<std::string, std::vector<std::string> > facts_;
};

class Dragon: virtual public Pokemon {
public:
    Dragon() : Pokemon() {}
    Dragon(std::map<std::string, std::vector<std::string> > &facts);
};

class Monster: virtual public Pokemon {
public:
    Monster() : Pokemon() {}
    Monster(std::map<std::string, std::vector<std::string> > &facts);
};   

class Charmander: public Monster, public Dragon {
public:
    Charmander() : Pokemon(), Monster(), Dragon(){}
    Charmander(std::map<std::string, std::vector<std::string> > &facts);
};

class Charmeleon: public Charmander {
public:
    Charmeleon() : Charmander() {}
    Charmeleon(std::map<std::string, std::vector<std::string> > &facts);
};

class Charizard: public Charmeleon {
public:
    Charizard() : Charmeleon() {}
    Charizard(std::map<std::string, std::vector<std::string> > &facts);
};

我只想知道如何编写类的默认构造函数。

我的编译器一直显示错误:

./List07.txt:10:10: error: no matching constructor for initialization of
  'Charmander'
POKENAME(Charmander)
~~~~~~~~~^~~~~~~~~~~
main.cpp:276:44: note: expanded from macro 'POKENAME'
#define POKENAME(type)  try { answer = new type(facts); } catch (int) {
                                       ^
./pokemon.h:148:7: note: candidate constructor (the implicit copy constructor)
      not viable: no known conversion from 'const std::map<std::string,
      std::vector<std::string> >' to 'const Charmander' for 1st argument
class Charmander: public Monster, public Dragon {
  ^
./pokemon.h:151:5: note: candidate constructor not viable: 1st argument ('const
  std::map<std::string, std::vector<std::string> >') would lose const
  qualifier
Charmander(std::map<std::string, std::vector<std::string> > &facts);
^
./pokemon.h:150:5: note: candidate constructor not viable: requires 0 arguments,
  but 1 was provided
Charmander() : Pokemon(), Monster(), Dragon(){}
^

2 个答案:

答案 0 :(得分:0)

你的错误非常清楚,清理混乱,这就是你最终的结果:

没有已知的转化&#39; const std::map<std::string, std::vector<std::string> >&#39; ...

候选构造函数不可行:第一个参数(&#39; const std::map<std::string, std::vector<std::string> >&#39;)会丢失const限定符 Charmander(std::map<std::string, std::vector<std::string> > &facts);

您正在将const对象传递给采用非const引用的构造函数。检查构造函数,这些构造函数接受const正确性的事实。

答案 1 :(得分:0)

编译器试图告诉你这里有什么问题:

  

没有来自&#39; const std :: map&lt; std :: string,std :: vector&lt; std :: string&gt;的已知转换&GT;&#39;

所以,显然facts是const,但是你的所有(非常奇怪的)构造函数都引用了非const,所以不能使用它们。