c++ - 如何在 Visual Studio(C++11) 中处理相互依赖/循环依赖
问题描述
我正在尝试为两个相互依赖的类创建头文件和类文件。我尝试使用#pragma once
,extern
类声明,在彼此的标题中声明类。它们似乎都不起作用。这是我的示例代码:
啊
#pragma once
#include "B.h"
class A
{
private:
int num;
public:
A();
void printB(B b);
int getA();
~A();
};
A.cpp
#pragma once
#include "stdafx.h"
#include "A.h"
#include <iostream>
A::A()
{
num = 5;
}
void A::printB(B b)
{
std::cout << "b = " << b.getB() << std::endl;
}
int A::getA()
{
return num;
}
A::~A()
{
}
溴化氢
#pragma once
#include "A.h"
class B
{
private:
char ch;
public:
B();
void printA(A a);
char getB();
~B();
};
B.cpp
#pragma once
#include "stdafx.h"
#include <iostream>
#include "B.h"
B::B()
{
ch = 'g';
}
void B::printA(A a)
{
std::cout << "a = " << a.getA() << std::endl;
}
char B::getB()
{
return ch;
}
B::~B()
{
}
Interedependency.cpp [入口点/主文件]
#pragma once
#include "stdafx.h"
#include "A.h"
int main()
{
A a;
B b;
a.printB(b);
b.printA(a);
return 0;
}
如何在 Visual Studio 中处理此类相互依赖的类?
解决方案
不要在标题中包含A.h
or ,而是在和in 中转发声明。
在您的 cpp 文件中,包含from和from 。 B.h
A
B.h
B
A.h
A.h
B.cpp
B.h
A.cpp
In A.h
- replace #include "B.h"
with class A;
- 这告诉编译器我们将使用该类A
,但我们稍后会提供详细信息。
编译器此时只关心类大小(在您的情况下)。
在 cpp 文件中,包含B.h
实际告诉编译器B
所有内容,因为您将实际使用它。对和
执行相同的操作 - 将包含替换为标头中的前向声明,并在源文件中包含其他标头。 B.h
B.cpp
此外,cpp 文件中不需要#pragma once
,这些文件已经编译过一次。
推荐阅读
- java - LinkedList 对象如何使用 Syso 输出内容?
- android - 蓝牙应用程序在启动时崩溃
- heroku - Heroku 正在重置节点红色应用程序数据
- jquery - 检查 XHR 返回什么响应 Jquery
- apache - Apache 虚拟主机非 www 不工作
- hashicorp-vault - 如何使用 Hashicorp Vault 设置用户名/密码身份验证
- javascript - 编码为十六进制字符串:参数必须是字符串 node.js
- python - 在 Keras 中计算两个张量之间的余弦相似度
- html - 如何使反应阻止浏览器缓存外部加载的html?
- javascript - 如何从wordpress url中提取令牌并给它一个变量/值?