没有匹配函数调用ctor,多重继承

时间:2014-02-23 15:40:00

标签: c++

我非常绝望我的其他类具有相同的继承作用,我写的这个类很简单,它不再有效。我不知道该怎么做,这是非常令人沮丧的,事实上它是一个简单的类,它定义了在创建时做出简单预定行为的敌人。

#include "RD_Infested.hpp"
#include "World.hpp"
#include "SteeringBehavior.hpp"

RD_Infested::RD_Infested(const string& oname, const sf::Vector2f& position, esc::World & w )
   : esc::Critter(oname , position, w),
     esc::Offensive(*this)
{
    esc::Critter::setPathTraversalPolicy(new esc::SteeringBehavior(*this));
}

RD_Infested::~RD_Infested()
{
}

void RD_Infested::update( float e )
{
     if (!esc::Object::isActive() )
         return;

     esc::Offensive::executeAttackOrder( e );
     esc::Offensive::executeDefensiveStance( e );

     if ( !esc::Offensive::isOnAttackRange() )
        esc::Critter::makePursuit( e );

     esc::Critter::getPathTraversalPolicy()->updatePolicy( e );
}

RD_Infested* RD_Infested::getInstance()
{
    return this;
}

这是它的类标题:

#ifndef RD_INFESTED_HPP
#define RD_INFESTED_HPP

#include <SFML/Graphics.hpp>

#include "Critter.hpp"
#include "Offensive.hpp"

class RD_Infested : public esc::Critter,
                    public virtual esc::Offensive
{
    public:
        RD_Infested( const string&, const sf::Vector2f&, esc::World& );
        virtual ~RD_Infested();

        virtual void update( float = 0.0f );
        RD_Infested* getInstance();
};

#endif // RD_INFESTED_HPP

所以这个班级所做的就是从作为移动物体的小动物继承,而进攻是其行为,所以在概念上它又变成了“攻击性的小动物”。

这是它给我的错误:

   error: no matching function for call to 'esc::Behavior::Behavior()'|

这是攻击性类:我删除了不必要的功能

#ifndef OFFENSIVE_HPP
#define OFFENSIVE_HPP

#include <string>
using std::string;

#include<stack>
using std::stack;

#include "Behavior.hpp"
#include "Weapon.hpp"

namespace esc
{
    class World;
    class Object;
    class Critter;
    class Manager;
    class AttackCapability;

    // Worlds

    class Offensive : public virtual Behavior
    {
    public:
        /****/

    protected:

        explicit Offensive( Critter * );
        virtual ~Offensive();

    private:
        /****/
    };
}

#endif // OFFENSIVE_HPP

这是行为类:

#ifndef BEHAVIOR_HPP
#define BEHAVIOR_HPP

#include<stack>
using std::stack;

#include <string>
using std::string;

#include "Critter.hpp"

namespace esc
{
class World;

class Behavior
{
    protected:

        explicit Behavior( Critter * );
        virtual ~Behavior();

    /****/

    private:
        /****/
    };
}

#endif // BEHAVIOR_HPP

这一个错误我不知道如何解决。我做了关于生成默认ctor但我仍然不知道甚至不了解这类问题的研究。我不知道如何解决这个问题。

感谢。 :)

2 个答案:

答案 0 :(得分:2)

您的Offensive构造函数需要指向Critter对象的指针:

explicit Offensive( Critter * );

但你传递一个对象

esc::Offensive( *this )

因为this是指针而您取消引用它。所以只需使用esc::Offensive(this)即可。但接下来的一点是,在派生类的构造函数初始化列表中将this指针传递给基类构造函数可能不是一个好主意。

答案 1 :(得分:1)

  

错误:没有匹配函数来调用'esc :: Behavior :: Behavior()'|

客户端的某些部分可能代码尝试使用其默认构造函数创建TestConstructDerived实例 定义了这个默认构造函数(因为它没有被带有参数或= delete的构造函数的定义禁用),但是Offensive的默认构造函数不是,因为它有一个定义了参数的构造函数。

有关定义默认构造函数的条件的详细信息,请参阅this question