如何解决这个头包括循环?

时间:2014-11-26 08:49:39

标签: c++ header-files

您好我已经阅读过有关此主题的类似问题,但我无法解决我的问题。 我想我必须做一个前瞻性声明,所以我尝试了以下内容。

我有三个类A,B和InterfaceA

Defintion InterfaceA

#ifndef INTERFACE_A_H
#define INTERFACE_A_H
#include "B.h"

namespace Example
{
  class B; // Forward declaration?
  class InterfaceA
  {
     Example::B test;

   };

}

#endif 

定义A级

#ifndef A_H
#define A_H
#include "InterfaceA.h"
namespace Example
{
  class A : public Example::InterfaceA
  {

  };
}
#endif

定义B级

#ifndef B_H
#define B_H
#include "A.h"

namespace Example
{
  class A; // Forward declaration?
  class B
  {
     Example::A test;
  };

}

#endif

主要

#include "A.h"
#include "B.h"
int main()
{
  Example::A a;
  Example::B b;
}

我在visual studio中收到以下错误:

'Example :: B :: test'使用未定义的类'Example :: A'

编辑: 到目前为止,谢谢你的帮助。这非常有帮助。我认为我的问题是我的实际项目中的设计非常糟糕。我会改变它。

除此之外,我现在对前瞻性声明有了更好的理解: - )

3 个答案:

答案 0 :(得分:3)

您正在创建循环依赖项。修改你的设计。

你真的需要A中B和B内的A类实例吗?

答案 1 :(得分:3)

如果你真的需要A类引用B类反之,而不是将A和B的实例作为数据成员,请考虑使用指针,例如像这样的东西:

// A.h

#pragma once

#include <memory> // for std::unique_ptr

// Forward declaration (A references B using pointer)
class B;

class A 
{
...
    std::unique_ptr<B> m_pB;
};

同样地:

// B.h

#pragma once

#include <memory> // for std::unique_ptr

// Forward declaration (B references A using pointer)
class A

class B 
{
...
    std::unique_ptr<A> m_pA;
};

<强> PS
与您的问题的核心无关,但请注意,我使用#pragma once代替“旧式”#ifndef/#define/#endif包括警卫; #pragma once对我来说似乎更简单,更清晰。

答案 2 :(得分:1)

相关问题