我有两个相互依赖的头文件,但是一个头文件无法看到另一个头文件。
此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;
}
问题是第二个头文件说代理是一个未识别的标识符。
答案 0 :(得分:2)
两个头文件可能都包含在内。所以第一个文件包含第二个文件,然后尝试再次包含第一个文件,但是失败,因为#pragma once
生效。因此,当需要时,第二个文件的必要定义不可用。
要解决此问题,您需要打破此循环依赖关系。执行此操作的最佳方法是将大量代码放入.cpp文件中(而不是将整个内容转储到标头中)。这将允许您减少包含的数量,希望到不再需要交叉包含的程度。您可能需要一些前向声明才能使其工作。
答案 1 :(得分:0)
头文件主要用于函数/变量声明,而不是定义。如果要为函数/变量的定义创建源文件( .cpp )并将其链接到每个头文件,则可以避免遇到的错误。