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

时间:2016-03-07 21:55:09

标签: c++ linker header-files

我有两个相互依赖的头文件,但是一个头文件无法看到另一个头文件。

此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;

此标题包含使用地图的功能

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

问题是第二个头文件说代理是一个未识别的标识符。

2 个答案:

答案 0 :(得分:2)

两个头文件可能都包含在内。所以第一个文件包含第二个文件,然后尝试再次包含第一个文件,但是失败,因为#pragma once生效。因此,当需要时,第二个文件的必要定义不可用。

要解决此问题,您需要打破此循环依赖关系。执行此操作的最佳方法是将大量代码放入.cpp文件中(而不是将整个内容转储到标头中)。这将允许您减少包含的数量,希望到不再需要交叉包含的程度。您可能需要一些前向声明才能使其工作。

答案 1 :(得分:0)

头文件主要用于函数/变量声明,而不是定义。如果要为函数/变量的定义创建源文件( .cpp )并将其链接到每个头文件,则可以避免遇到的错误。