C2061 - 循环依赖
如何避免这些代码循环依赖: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'
的问题是character
有一个函数,接受monster&
和monster
有一个函数,接受character&
,但你不声明其他任何类案件。值得庆幸的是,因为你只是传递类作为参数在这两个地方(而不是让他们成为会员或某事),足以在这两个地方,以前瞻性声明这两个类:
// in character.h
namespace monsters {
class monster; // just fwd-declare
}
namespace characters {
class character {
// as before
};
}
而在其他类似文件。
[更新]此外,您只需在头文件中引用class character
中的monster
,您需要将其限定为monsters::monster
。
我改变了它,但我仍然有https://imgur.com/ybGQDnt – Kulis 2014-11-05 18:44:29
@Kulis你显示的错误,但不是代码行,这对任何人都没有帮助。 – 2014-11-05 18:51:26
https://imgur.com/SyNrqbA(35)void character_atack(const character&cha,monster&monst); (24)void monster_atack(character&cha,const monster&monst); (69)void character :: character_atack(const character&cha,monster&monst) (75)void monster :: monster_atack(character&cha,const monster&monst) – Kulis 2014-11-05 19:07:39
第一个错误来自于下面的行Characters.h
void character_atack(character const cha, monster &monst);
您包括Characters.h到您的.cpp文件你包括Monsters.h,因此类型之前怪物尚未公布。为了解决这个问题,改变你的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)
,以防止不必要的复制操作。 (取决于当然的优化)
这不是一个循环依赖。 – CoryKramer 2014-11-05 17:57:37
@Kulis:这似乎是编译器错误。你能发布完整的源代码吗? – Sumeet 2014-11-05 18:00:15
通过const引用将character传递给character_attack,以避免每次都复制整个对象。 – 2014-11-05 18:01:28