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);
};
}

Компилятор выдает мне такие ошибки:

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'

0

Решение

Проблема в том, что character имеет функцию, которая принимает monster& а также monster имеет функцию, которая принимает character&, но вы не объявляете другой класс в любом случае. К счастью, поскольку вы просто передаете классы в качестве аргументов в обоих местах (в отличие от того, чтобы они были членами или чем-то еще), достаточно объявить оба класса в обоих местах:

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

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

И похоже в другом файле.

[обновление] Кроме того, вы просто ссылаетесь monster Внутри class character в заголовочном файле, вы должны квалифицировать его как monsters::monster,

3

Другие решения

Первая ошибка происходит из следующей строки в 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)

предотвратить ненужные операции копирования. (в зависимости от оптимизации курса)

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector