在C ++中转发声明的类

时间:2011-12-08 11:34:48

标签: c++ class

我遇到了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类没有完全定义。

我该如何解决这个问题?

5 个答案:

答案 0 :(得分:4)

在声明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文件中。

答案 1 :(得分:1)

我建议在类声明之外移动方法的实现,如下所示:

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

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

void B::Method1(A* instanceOfA) {
    ...
}

答案 2 :(得分:0)

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

class B;

class A
{
    Method1(B* instaceOfB);
    MethodX();
};

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

当然,如果A::Method1函数也是内联函数,则不起作用。

答案 3 :(得分:0)

你的impl代码是否在头文件中?如果是这样,请尝试将其移至cpp文件并#include A和B

答案 4 :(得分:0)

您是否有理由需要实施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();
  .......
}