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

问题描述:

我有两个相互依赖的头文件,但是一个头文件无法看到另一个头文件。无法从头文件中看到全局变量文件

该头文件声明了地图代理

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

的问题是,所述第二头文件说代理是一个未识别的识别符的功能。

+0

数据不足...此程序员现在将退出。 – user4581301

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

要解决这个问题,你需要打破这种循环依赖。做到这一点的最佳方法是将大量代码放入.cpp文件(而不是将所有内容转储到标题中)。这将允许您减少包含的数量,希望达到不再需要跨包含的程度。你可能需要一些前向声明来完成这个工作。

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