2012-11-16 44 views
1

我的事类是从它具有以下构造实体类派生没有默认构造函数存在类,但非默认通过

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)){} 

的问题是我得到的错误“没有适当的默认构造函数可用“在我的Thing构造函数上。我指定使用我的实体构造函数而不是默认值的问题是什么。为了使更混乱了我的问题,我有一个从实体derieved另一个类的作品

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) 
{ 
} 

,如果没有错误运行,但它似乎是为我的事构造函数更多的变数同样的事情。我确定我错过了一些小事,但我一直难住。

你是对的,有一些剩余的代码没有被注释掉。看起来很奇怪,并且构造函数中出现了成员变量减速中的错误,不过谢谢。这总是帽子给我带来的简单的东西。

+1

它可能没有类定义,你是否在Thing的头文件中声明实体,但忘记在Thing的cpp文件中包含#include? – Alex

+3

您发布的代码很好。你可以在其他地方调用Entity()。 – billz

+1

也许你有一些'Thing'的数据成员,它忘记了包含在你的初始化列表中,但没有默认的构造函数。 – john

回答

0

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

#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; 
} 

在克++,精确的错误是:

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&) 
0

假设Thing::m_Weapon被声明为Weapon而不是作为Weapon*Weapon&,或equivilent,则需要更改此:

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作为输入。