如何在Visual Studio中处理依赖关系/循环依赖(C ++ 11)

时间:2018-05-09 04:50:09

标签: c++ class circular-dependency

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

  

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

1 个答案:

答案 0 :(得分:0)

请勿在标头中加入A.hB.h,而应在[{1}}中转发声明A,在B.h中转发B
在您的cpp文件中,请A.h中的A.hB.cpp中的B.h

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

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