c++ - C2061 - 循环依赖

标签 c++ circular-dependency circular-reference

如何避免对这些代码的循环依赖:

机械师.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;
}

怪物.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'

最佳答案

问题是 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 .

关于c++ - C2061 - 循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26763887/

相关文章:

.net - 循环依赖与 DRY

winforms - .net dottrace 内存分析使用问题 - 过滤循环引用

java - int/String 链表和变量的问题

c++ - Qt - QCalendarWidget 删除所有 TextFormats

c++ - 在这种情况下如何决定堆栈、堆和 boost::pool 分配?

c++ - 如何编写一个程序来显示一个数是否为质数,并可以显示文件中从 1 到 100 的质数

c++ - GCC 9.1 返回 void& 作为显式析构函数调用的结果类型。这是一个错误吗?

symfony - 序列化类 "App\Entity\User"的对象时检测到循环引用(配置限制: 1)

python - 尝试避免 Python 循环依赖

database - 如何正确设计数据库的这一部分(循环引用?)