我正在尝试为两个相互依赖的类创建头文件和类文件。我尝试使用#pragma once
,extern
类声明,在彼此的标头中声明类。他们似乎都没有工作。这是我的示例代码:
A.H
#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()
{
}
B.h
#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中处理这种相互依赖的类?
答案 0 :(得分:0)
请勿在标头中加入A.h
或B.h
,而应在[{1}}中转发声明A
,在B.h
中转发B
。
在您的cpp文件中,请A.h
中的A.h
和B.cpp
中的B.h
。
在A.cpp
中 - 将A.h
替换为#include "B.h"
- 这告诉编译器我们将使用类class A;
,但我们稍后会提供详细信息。<登记/>
此时编译器只关心类大小(在您的情况下)
在cpp文件中,包括A
以实际告诉编译器B.h
的全部内容,因为您将实际使用它。
对B
和B.h
执行相同操作 - 在标头中使用前向声明替换include,并在源文件中包含其他标头。
此外,cpp文件中不需要B.cpp
,这些文件已经编译过一次。