首页 > 解决方案 > 如何在 Visual Studio(C++11) 中处理相互依赖/循环依赖

问题描述

我正在尝试为两个相互依赖的类创建头文件和类文件。我尝试使用#pragma onceextern类声明,在彼此的标题中声明类。它们似乎都不起作用。这是我的示例代码:

#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 中处理此类相互依赖的类?

标签: c++classcircular-dependency

解决方案


不要在标题中包含A.hor ,而是在和in 中转发声明。 在您的 cpp 文件中,包含from和from 。 B.hAB.hBA.h
A.hB.cppB.hA.cpp

In A.h- replace #include "B.h"with class A;- 这告诉编译器我们将使用该类A,但我们稍后会提供详细信息。
编译器此时只关心类大小(在您的情况下)。
在 cpp 文件中,包含B.h实际告诉编译器B所有内容,因为您将实际使用它。对和
执行相同的操作 - 将包含替换为标头中的前向声明,并在源文件中包含其他标头。 B.hB.cpp

此外,cpp 文件中不需要#pragma once,这些文件已经编译过一次。


推荐阅读