2014-11-05 5 views
0

이 코드에 순환 종속성을 방지하는 방법 :C2061 - 순환 종속성

Mechanic.cpp :

#include "stdafx.h" 
#include "Characters.h" 
#include "Monsters.h" 

using namespace characters; 
using namespace monsters; 
using namespace std; 

void character::character_atack(character const cha, monster &monst) 
{ 
    if (cha.dexterity + k(20) >= monst.defense) 
     monst.health = monst.health - cha.strength; 
} 
int k(int const max) 
{ 
    return (rand() % max); 
} 
void monster::monster_atack(character &cha, monster const monst) 
{ 
    if (monst.atack + k(20) >= cha.dexterity) 
     cha.health = cha.health - monst.damage; 
} 

Monsters.h :

#include <iostream> 
#include <string> 

namespace monsters 
{ 
    using namespace std; 

    class monster{ 
    protected: 
     string name; 
    public: 
     int atack; 
     int damage; 
     int health; 
     int defense; 

     monster(int atk, int dmg, int hp, int def) : atack(atk), damage(dmg), 
       health(hp), defense(def) {} 
     ~monster(); 

     void monster_atack(character &cha, monster const monst); 
    }; 

    class greenskins:monster{ 
     greenskins(int atk, int dmg, int hp, int def) : monster(atk, dmg, hp, def) {} 
    }; 
} 

Characters.h :

#include <iostream> 
#include <string> 
#include <vector> 

namespace characters 
{ 
    using namespace std; 

    class character{ 
    protected: 
     int level; 
     int experience; 
     string name; 
    public: 
     int health; 
     int strength; 
     int intelligence; 
     int dexterity; 

     struct position{ 
      int x; 
      int y; 
     }pos; 

     character(int str, int in, int dex) : strength(str), intelligence(in), 
       dexterity(dex), level(1), experience(0) { 
      cout << "What's your name?" << endl; 
      cin >> name; } 
     ~character(); 

     void info_character(); 
     void character_atack(character const cha, monster &monst); 
    }; 
} 

이 컴파일러는 저에게 다음과 같은 에러를 제공합니다 : thi S :

Error 1 error C2061: syntax error : identifier 'monster' 

또는

Error 9 error C2511: 'void monsters::monster::monster_atack(characters::character &,const monsters::monster)' : overloaded member function not found in 'monsters::monster' 
+5

순환 의존성이 아닙니다. – CoryKramer

+0

@Kulis : 이것은 컴파일러 오류 인 것 같습니다. 전체 소스 코드를 게시 할 수 있습니까? – Sumeet

+1

매번 전체 개체를 복사하지 않으려면 const 참조로 character_attack에 문자를 전달하십시오. –

답변

3

문제는 charactermonster&monstercharacter&를 취하는 기능이 걸리는 기능을 가지고 있지만, 당신이 다른 클래스를 선언하지 않는 것이 중 케이스. (그들이 회원 또는 뭔가도록하는 것과는 반대로) 당신은 단지 두 곳에서 인수로 클래스를 통과하기 때문에 다행히, 두 곳 모두에서 클래스를 전달-선언하기에 충분하다 :

// in character.h 
namespace monsters { 
    class monster; // just fwd-declare 
} 

namespace characters { 
    class character { 
     // as before 
    }; 
} 

그리고 다른 유사한 파일.

[업데이트] 또한 class charactermonster을 헤더 파일에 참조한 것이므로 monsters::monster으로 한정해야합니다.

+0

나는 그것을 바꿨지 만 여전히 https://imgur.com/ybGQDnt를 가지고있다 – Kulis

+1

@Kulis 당신은 코드 라인이 아닌 에러를 보여 주므로 누구에게 도움이되지 않는다. –

+0

https://imgur.com/SyNrqbA (35) 무효 character_atack (const 문자 및 차, 괴물 및 몬스터); (24) void monster_atack (캐릭터 & 차, const monster & monst); void character :: character_atack (const character & cha, monster & monst) (75) void monster :: monster_atack (캐릭터 및 캐릭터, const 몬스터 및 몬스터) – Kulis

1

첫 번째 오류는 Monsters.h 따라서 유형을 포함하기 전에 당신은 당신의 .cpp 파일에 Characters.h을 포함 에 다음 줄에서 Characters.h

void character_atack(character const cha, monster &monst); 

온다 괴물는 아직 알려져 있지 않습니다. 이 문제를 해결하려면 다음과 같이 당신의 Characters.h을 변경

... //includes 
namespace monsters { 
    class monster; 
} 

namespace characters { 
    class character { 
     ... //class definition 
    } 
} 

두 번째 오류는 일치하지 않는 서명입니다. 당신은 다음과 같은 방법을 선언됩니다

void monster_atack(character &cha, monster const monst) 

을하지만 컴파일러가 말한 그 적어도

void monster::monster_atack(character &cha, const monster monst) 

을 정의.

난에 서명을 변경하는 제안 :

void monster_atack(character &cha, const monster& monst) 

불필요한 복사 작업을 방지 할 수 있습니다. (물론 최적화에 따라 다름)