c++中的前向声明类

forward declared class in C++

本文关键字:声明 c++      更新时间:2023-10-16

我对c++有一个问题。

我想创建两个类,A和b。

类A有一些方法接受的参数是类B的一个实例。但在类B中,我也有一些方法接受的参数是类A的一个实例。

我尝试前向声明类A,然后定义类b。最后,我定义了类A。

一些代码:

class A;
class B
{
  void Method1(A* instaceOfA)
 {
     instaceOfA->MethodX();
 }
  .......
};
class A
{
  Method1(B* instaceOfB);
  MethodX();
  .......
};

我在Visual Studio 2010中编写代码,它显示了一个错误,因为我在类A中调用MethodX,但类A没有完全定义。

我该如何解决这个问题?

B::Method1的定义放在class A声明之后

//header file
class A;
class B
{
  void Method1(A* instaceOfA);
  .......
};
class A
{
  Method1(B* instaceOfB);
  MethodX();
  .......
};
// cpp file
 void B::Method1(A* instaceOfA);
 {
     instaceOfA->MethodX();
 }

这就是.cpp文件的目的。在头文件中声明类和方法,然后将定义添加到.cpp文件中。

我建议把方法的实现移到类声明之外,像这样:

class A;
class B {
public:
    void Method1(A* instanceOfA);
    ...
};
class A {
public:
    void Method1(B* instanceOfB);
    void MethodX();
    ...
};
void B::Method1(A* instanceOfA) {
    ...
}

以相反的方式定义和声明类?

class B;
class A
{
    Method1(B* instaceOfB);
    MethodX();
};
class B
{
    void Method1(A* instaceOfA)
    {
        instaceOfA->MethodX();
    }
};

当然,如果A::Method1函数也是内联的,这就不起作用了。

您的impl代码在头文件中吗?如果是的话,试着把它移到一个cpp文件中,#include a和B

是否有需要实现内联类B的原因?如果将类定义与实现分开(理想情况下将它们放在。h和。cpp文件中),这个问题就会解决。

//blah.h
class A;
class B
{
  void Method1(A* instaceOfA);
  .......
};
class A
{
  Method1(B* instaceOfB);
  MethodX();
  .......
}l

//blah.cpp
#include "blah.h"
class B
{
  void Method1(A* instaceOfA)
 {
     instaceOfA->MethodX();
 }
  .......
};
class A
{
  Method1(B* instaceOfB)#
  {
      instaceOfB->Method1();
  }
  MethodX();
  .......
}