无法从 header 文件中看到全局变量

Can't see global variable from header File

我有两个相互依赖的 header 文件,但是一个 header 文件看不到另一个文件的变量。

此 Header 文件声明地图代理

#pragma once
#include <agents.h>
#include "Manage_A.h"

class M_Agent : public Concurrency::agent
{
public:

    explicit M_Agent(Concurrency::ISource<int>& source, Concurrency::ITarget<wstring>& target) :
        _source(source), _target(target)
    {

    }

protected:
    void run() {
        cout << "What Would You Like to Do?\n"
            << "1. Manage Agents\n"
            << "2. See Info From Agents\n"
            << "3. Alerts\n"
            << "4. Quit\n";
        cin >> choice;
        switch (choice)
        {
            //Manage Agents
        case 1:
            Manage_A();
            run();
            break;

            //See Info from Agents
        case 2:
            cout << "INfo\n";
            run();
            break;

            //Alerts
        case 3:
            cout << "Alerts\n";
            run();
            break;

            //Quit
        case 4:
            exit(0);
            break;

            //Try again
        default:
            run();
            break;
        }

        //done();

    }

private:
    int choice{ 0 };
    Concurrency::ISource<int>& _source;
    Concurrency::ITarget<wstring>& _target;
};


extern std::map<string, M_Agent*> Agents;
extern Concurrency::overwrite_buffer<int> buffer1;
extern Concurrency::unbounded_buffer<wstring> buffer2;

此 header 包含使用地图

的函数
#pragma once
#include"M_Agent.h"
#include"F_Agent.h"
#include"Variables.h"


void Create_A()
{
    system("cls");
    string name{ "" };
    int a_type{ 0 };
    std::cout << "Please Name Agent\n";
    std::cin >> name;
    while (true)
    {
        std::cout << "What Type of Agent Would You like\n"
            << "1. Main Agent\n"
            << "2. File Agent\n"
            << std::endl;
        std::cin >> a_type;

        if (std::cin.good())
        {
            break;
        }
        else
        {
            system("cls");
            std::cout << "Please enter correct choice" << std::endl;
        }
        std::cin.clear();
        std::cin.ignore();
    }
    switch (a_type)
    {
        //Create Main Agent
    case 1:
        Agents.insert(std::make_pair(name, new M_Agent(buffer1, buffer2)));
        system("cls");
        break;

        //Create File Agent
    case 2:
        F_Agents.insert(std::make_pair(name, new File_Agent(buffer1, buffer2)));
        system("cls");
        break;
    }

    return;
}

问题是第二个 header 文件说 Agents 是一个无法识别的标识符。

两个 header 文件可能相互包含。因此第一个文件包含第二个文件,然后尝试再次包含第一个文件,但失败了,因为 #pragma once 已生效。因此,第二个文件的必要定义在需要时不可用。

要解决这个问题,您需要打破这种循环依赖。执行此操作的最佳方法是将大部分代码放入 .cpp 文件中(而不是将整个代码转储到 headers 中)。这将允许您减少包含的数量,希望减少到不再需要 cross-include 的程度。不过,您可能需要一些前向声明才能完成这项工作。

头文件主要用于function/variable声明,而不是定义。如果您要为每个头文件的 functions/variables 和 link 的定义创建一个源文件 (.cpp),您可能会避免错误你正在经历的。