2014-02-23 4 views
1

동일한 상속 작용을하는 다른 클래스가 필사적입니다. 필자가 작성한이 클래스는 단순하고 더 이상 작동하지 않습니다. 나는 무엇을 해야할지 모르겠다. 매우 실망 스럽다. 사실 그것은 단순한 미리 결정된 행동을 만드는 적을 정의하는 간단한 클래스이다. 여기ctor와 일치하는 함수 호출이 없습니다. 복수 상속

#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 객체에 대한 포인터를 기대

+1

기본 ctor는 프로그래머가 ctor를 제공하지 않는 경우에만 생성됩니다. –

+0

예 기본 ctor를 제공하지 않았지만 왜 생성합니까? 이미 이미 공격 클래스에 대한 주장을 이미 입증하고 있습니다. 실제로 RD_Infested가 Offensive Critter 일 때 볼 수 있듯이, 먼저 Critter가 생성되고 다음 공격은 Critter 클래스에 대한 포인터를받습니다. 나는 여기에 내 코드에 계속 추함이 있다는 것을 알고 있지만이 오류로 인해 나는 오늘 밤 잠을 자지 못한다. –

+0

불쾌감은 행동을 상속하고 그 행동을 부릅니다. 명시 적으로 호출하지 않으므로 기본값이 호출됩니다. 그러나 행동에는 기본 ctor가 없습니다.그것이 오류 메시지가 말하고자하는 것입니다. –

답변

1

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

클라이언트의 일부 코드는 기본 생성자를 사용하여 TestConstructDerived 인스턴스를 생성하려고합니다.
이 기본 생성자는 정의되어 있습니다 (인수가있는 생성자의 정의 또는 = delete에 의해 비활성화되어 있지 않으므로). Offensive의 기본 생성자는 인수가 정의 된 생성자가 있으므로 정의되지 않습니다.

기본 생성자가 정의되는 조건에 대한 자세한 내용은 this question을 참조하십시오.

+0

그래, 이거 야. 코드의 일부에서이 오류가 발생합니다. 그 링크도 주셔서 감사합니다! –

2

:

explicit Offensive(Critter *); 

을하지만, 당신이 그것을 this

esc::Offensive(*this) 

에 개체를 전달 그것을 역 참조 포인터하고있다. 따라서 esc::Offensive(this)을 사용하십시오. 그러나 다음은 파생 클래스의 생성자 초기화 목록에서 기본 클래스 생성자에 this 포인터를 전달하는 것이 좋지 않을 수 있다는 것입니다.

+0

와우! 나는 그것을 어떻게 놓칠 수 있습니까? 고마워,하지만 왜 그렇게 좋은 생각이 아닌거야? 이 모든 것을하기 전에 나는 매우 추악한 계층 구조를 만들었습니다. 그것은 유연성을 제공하지 않으므로 그 계층 구조에서 공격적으로 분리되어 내 실체에 대한 행동으로 간주하기로 결정했습니다. 이제 엔티티는 원하는 대상, 즉 Doodad 또는 Critter를 상속하며 공격, 생성 또는 지원하려는 경우 행동을 상속 할 수 있습니다. 내 행동 클래스는 기술적으로 호스트에 대한 정보가 필요합니다. 이것이 제가 한 이유입니다. 머리 숙여 감사드립니다. : P –

+0

여전히 같은 오류가 있습니다. 어떤 종류의 오류가 발생합니까? –

+0

문제는 생성자 이니셜 라이저 목록에서 객체가 제대로 초기화되지 않았고 'this'를 다른 객체에 전달하면 초기화되지 않은 멤버에 액세스하거나 초기화되지 않은 멤버의 값을 반환하는 함수를 호출 할 수 있습니다. – sleepy42

관련 문제