如何转发声明一个类的成员函数在另一个类中使用?

phy*_*ion 12 c++ forward-declaration

我已经制作了两个相同的类X和Y,并且指向了彼此.请参阅下面的代码Xh,Yh与所有X和Y的互换相同.但是,此代码在我的方法Connect中出错(错误C2027:使用未定义类型'Y').在Xh中,我已经向前声明了类Y,但它不知道Y有一个名为SetXPointer的方法.因此我还需要转发声明这个方法,对吗?

如果我尝试这样做(添加行Y :: SetXPointer(X*pX_in);在行类Y;)下,我得到编译器错误C2761:'void Y :: SetXPointer(X*)':成员函数重新声明不允许.有没有办法在类X中使用类Y的公共方法?

// X.h

#pragma once

#include "Y.h"

// Forward declaration
class Y;

class X
{
public:
    X(void) : data(24) {};
    ~X(void) {};
    int GetData() { return data; }
    void SetYPointer(Y* pY_in) { pY = pY_in; }
    Y* GetYPointer() { return pY; }
    void Connect(Y* Y_in) { pY = Y_in; Y_in->SetXPointer(this); }
private:
    int data;
    Y *pY;
};
Run Code Online (Sandbox Code Playgroud)

MvG*_*MvG 15

不要在类体中包含方法体.编写这两个类,在两个类完成后,编写方法实现:

class Y;
class X {
  …
  void Connect(Y* Y_in);
  …
};
class Y {
  …
  void Connect(X* X_in);
  …
};
inline void X::Connect(Y* Y_in) {
  pY = Y_in;
  Y_in->SetXPointer(this);
}
inline void Y::Connect(X* X_in) {
  pX = X_in;
  X_in->SetXPointer(this);
}
Run Code Online (Sandbox Code Playgroud)

这样,在Connect实现方法时,可以获得有关如何将类的对象放置在内存中的完整信息.并且作为类体中的方法和声明的方法inline都将以相同的方式内联,性能也将是相同的.

唯一的缺点是你不能以合理的方式将这两个类分成两个标题.

  • `inline` 函数必须进入它们的类所在的头文件。否则,实现它们的编译单元不会为它们生成链接器符号,因为它希望它们由编译器内联。每个其他编译单元都不会知道内联,因此会生成对永远不可用的符号的引用。 (2认同)