C++ 循环依赖,未声明的标识符

Posted

技术标签:

【中文标题】C++ 循环依赖,未声明的标识符【英文标题】:C++ circular dependency, undeclared identifier 【发布时间】:2020-05-12 17:04:44 【问题描述】:

我必须让它们互相使用,但无论我尝试什么,我都无法让它们发挥作用。 我只是想让他们互相访问,经过几天的努力,我决定在这里问。 如果有人能指出我做错了什么以及我应该做什么,那就太好了。

编辑:我决定实施其中一种已经发生堆栈溢出的解决方案,并据此更改了我的代码: 这次我也会分享错误,也许我们可以找出问题所在。

我试图复制这个: Resolve build errors due to circular dependency amongst classes

我使用班级名称“Unit”而不是“A”和“Skill”而不是 “乙”

技能.h

#pragma once
#include <iostream>
#include <vector>
#include "Unit.h"
using namespace std;



class Skill :
    public Unit


    double _val;
    Unit* unitPtr;
public:

    Skill(double val):_val(val)
    

    

    void SetSkill(Unit* unit)
    
        unitPtr = unit;
        unitPtr->Print();
    

    void Print()
    
        cout << "Type:B val=" << _val << endl;
    



//  Unit* unitPtr;
    vector <Skill *> attacks;
    vector <Skill *> utilities;
    vector <Skill *> movement;


;

单位.h

#pragma once
#include <iostream>
#include <vector>
#include <stdlib.h> 
#include <time.h> 
using namespace std;

class Skill;
class Unit


    int _val;
    Skill* skillPtr;


public:

    Unit(int val) :_val(val)
    
        stunned = false;
        curSpeed = speed + rand() % 8 + 1;
    

    void SetSkill(Skill* skill)
    
        skillPtr = skill;
        skillPtr->Print(); // COMPILER ERROR: C2027: use of undefined type 'B'
    

    void Print()
    
        cout << "Type:A val=" << _val << endl;
    

    int GetDodge()
           
        return dodge;
       
    void Setup();

    string name;
    int maxHP;
    //... and other variables

;

单位.cmp

#include "Skill.h"
#include "Unit.h"

void Unit::Setup()


    heroes.push_back(new Vestal);
    heroes.push_back(new Vestal);
    heroes.push_back(new Crusader);
    heroes.push_back(new Crusader);

    monsters.push_back(new BoneSoldier);
    monsters.push_back(new BoneDefender);
    monsters.push_back(new BoneSoldier);   
    monsters.push_back(new BoneDefender);


稍后在代码中,我向攻击、实用程序和时刻添加了一些东西,我想从 Unit 对象访问它们,如下所示:

英雄[0]->skillPtr->攻击[0]

我希望能够从 Skill.h 访问 Unit.h 中的变量(如 maxHP)

错误:

错误 C2512“技能”:没有合适的默认构造函数可用 错误 C2512 'Unit':没有合适的默认构造函数可用

【问题讨论】:

循环依赖相关的帖子太多了。我希望其中一位能给你答案。 ***.com/search?q=%5Bcpp%5D+circular+dependency 这能回答你的问题吗? Resolve build errors due to circular dependency amongst classes 是的,有很多相关的帖子,我尝试应用它们,但由于某种原因,无论我尝试什么,我都遇到了不同的错误。过了一段时间我就放弃了 您在 Skill.h 中实现了一个解决方案,只需在 unit.h 中使用相同的模式即可。 @WernerHenze 我应用了它,但它仍然给我错误:Error C2504 'Unit': base class undefined 【参考方案1】:

我是初学者,但也许我可以在这里看到一些可能会导致您遇到问题的问题。

首先你在这里有一个经典的循环依赖,Unit.h 包含 Skill.h,其中包含 Unit.h,其中包含 Skill.h 等等。

其次,没有看到任何#pragma once pre-proccessor 指令。这意味着当您继续尝试在您的单元 CPP 文件中包含 Skill.h 和 Unit.h 时,您将尝试多次包含 .h 文件,因为它们相互包含...

第三,您在全局范围内使用命名空间 std。你可以这样做,但不要那样做。

如果您想了解更多,请尝试这个关于该主题的精彩视频

https://www.youtube.com/watch?v=Zbw58vTotok

【讨论】:

循环依赖一是我在更新帖子时犯的一个错误,现在应该没问题了。关于其他的事情,我会调查的,谢谢。 顺便说一句,这是一个非常好的视频,帮助了我,再次感谢你。

以上是关于C++ 循环依赖,未声明的标识符的主要内容,如果未能解决你的问题,请参考以下文章

C++循环依赖

不同命名空间内的类的循环依赖 C++

循环依赖结构,使用前向声明时重新定义结构错误

循环依赖的三种方式

Spring 三种方式的循环依赖

C++模板函数导致循环依赖