gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 23:13:18 28 4
gpt4 key购买 nike

我创建了两个相同的类 X 和 Y,并带有一个指向彼此的指针。请参阅下面的 X.h 代码,Y.h 与所有交换的 X 和 Y 相同。但是,此代码在我的方法 Connect 中出现错误(错误 C2027:使用未定义的类型“Y”)。在 X.h 中,我已经前向声明了类 Y,但它不知道 Y 有一个名为 SetXPointer 的方法。因此我也需要转发声明这个方法,对吗?

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

// 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;
};

最佳答案

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

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);
}

这样,在实现 Connect 方法时,就可以获得有关类对象如何在内存中布局的完整信息。并且由于类主体中的方法和声明的方法 inline 都将以相同的方式内联,因此性能也将相同。

唯一的缺点是您将无法以合理的方式将这两个类拆分为两个标题。

关于c++ - 如何转发声明一个类的成员函数以在另一个类中使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11344195/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com