c++中与内联函数的相互包含

Mutual inclusion with inline function in C++

本文关键字:包含 函数 c++      更新时间:2023-10-16

我想写一些这样的代码:一个A对象调用它的类B类型成员b的成员函数DoSomething,在B类的DoSomeOtherThing成员函数中调用ANotify成员函数。请看下面的代码:

A类:

class A
{
    B b;
public:
    A() : b(*this)
    {
    }
    void DoSomething()
    {
        b.DoSomething();
    }
    void Notify()
    {
    }
};

B类:

class B
{
    A &a;
public:
    B(A &a) : a(a)
    {
    }
    void DoSomething()
    {
    }
    void DoSomeOtherThing()
    {
        a.Notify();
    }
};

问题是我想保持函数内联,所以代码应该在头文件中。我不能简单地包含彼此,因为它们可能会导致相互包含,而且我不知道在这种情况下是否可以使用前向声明。我可以在源文件中编写实现,但它们不会是内联函数。那么,我怎样才能使代码工作呢?

您可以将成员函数的定义移出类定义,并且仍然保持它们内联(因此在头文件中),方法是显式地使用inline作为其类外定义的前缀。完成这些之后,您会注意到

  • B的类定义可以很容易地移动到A的成员函数定义之前,解决了从这些成员访问B的问题,并且
  • A的类定义只需要前向声明B,所以在A的定义之前添加class B;解决了这个问题。

做这两个改变就足以解决你的问题。