我非常绝望我的其他类具有相同的继承作用,我写的这个类很简单,它不再有效。我不知道该怎么做,这是非常令人沮丧的,事实上它是一个简单的类,它定义了在创建时做出简单预定行为的敌人。
#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但我仍然不知道甚至不了解这类问题的研究。我不知道如何解决这个问题。
感谢。 :)
答案 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。