无法从 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),您可能会避免错误你正在经历的。
我有两个相互依赖的 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),您可能会避免错误你正在经历的。