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

no matching function call to ctor, multiple inheritance

本文关键字:CTOR 多重继承 函数调用      更新时间:2023-10-16

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

#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 的研究,但我仍然不知道甚至不理解这种问题。我不知道如何解决这个问题。

谢谢,:)

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

explicit Offensive( Critter * );

但是你把一个对象传递给它

esc::Offensive( *this )

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

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

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

有关定义默认构造函数的条件的详细信息,请参阅此问题。