类没有默认构造函数,但是默认传递

时间:2012-11-16 22:47:34

标签: c++ list constructor initialization default

My Thing类派生自Entity类,它具有以下构造函数

    Entity::Entity(string sNames, double xcord, double ycord)
    :m_sName(sNames), m_dX(xcord),m_dY(ycord){}

Thing的构造函数是

    Thing::Thing(string sName, double xcord, double ycord):
    Entity(sName, xcord, ycord),
    m_iHealth(100),m_Weapon(Weapon("Fists", false, 10.0, 5, 1.0, xcord, ycord)){}

问题是我在Thing构造函数中遇到错误“没有合适的默认构造函数”。我指定使用我的Entity构造函数而不是默认值的问题是什么。为了让这个问题更让我感到困惑,我还有另一个来自实体的课程

    Weapon::Weapon(string sName, bool iMagical, double dRange, int iDamage,double
    dRadius, double dSpawnX, double dSpawnY):
    Entity(sName, dSpawnX, dSpawnY), m_bMagical(iMagical), m_dRange(dRange), m_iDamage(iDamage),
    m_dRadius(dRadius)
{
}

运行没有错误,但它似乎与我的Thing构造函数具有更多变量完全相同。我确定我错过了一些小事,但我已经被困了一段时间。

你是对的,有一些没有被注释掉的剩余代码。看起来很奇怪,成员变量减速中的错误出现在构造函数中,但无论如何都要感谢。这总是帽子给我带来的简单事情。

2 个答案:

答案 0 :(得分:0)

或许你的Thing实际上没有默认构造函数,而且需要一个。{1}}。像这样的程序可能会像你看到的那样产生错误。

#include <string>
using std::string;

struct Entity {
  std::string m_sName;
  double m_dX, m_dY;
  Entity(std::string, double, double);
};
struct Weapon : Entity {
  bool m_bMagical;
  double m_dRange;
  int m_iDamage;
  double m_dRadius;
  Weapon(std::string, bool, double, int, double, double, double);
};
struct Thing : Entity {
  int m_iHealth;
  Weapon m_Weapon;
  Thing(std::string, double, double);
};


// OP's code starts here
Entity::Entity(string sNames, double xcord, double ycord)
    :m_sName(sNames), m_dX(xcord),m_dY(ycord){}

Thing::Thing(string sName, double xcord, double ycord):
    Entity(sName, xcord, ycord),
    m_iHealth(100),m_Weapon(Weapon("Fists", false, 10.0, 5, 1.0, xcord, ycord)){}

Weapon::Weapon(string sName, bool iMagical, double dRange, int iDamage,double
    dRadius, double dSpawnX, double dSpawnY):
    Entity(sName, dSpawnX, dSpawnY), m_bMagical(iMagical), m_dRange(dRange), m_iDamage(iDamage),
    m_dRadius(dRadius)
{
}
// OP's code ends here

int main () {
  Thing th;
}

在g ++下,准确的错误是:

th.cc: In function ‘int main()’:
th.cc:40: error: no matching function for call to ‘Thing::Thing()’
th.cc:27: note: candidates are: Thing::Thing(std::string, double, double)
th.cc:16: note:                 Thing::Thing(const Thing&)

答案 1 :(得分:0)

假设Thing::m_Weapon被声明为Weapon而不是Weapon*Weapon&或等效,那么您需要更改此内容:

m_Weapon(Weapon("Fists", false, 10.0, 5, 1.0, xcord, ycord))

到此

m_Weapon("Fists", false, 10.0, 5, 1.0, xcord, ycord)

您正在构建一个临时Weapon,然后尝试从该临时值构建m_Weapon。据推测,Weapon没有以Weapon作为输入的复制构造函数。