我已经制作了两个相同的类X和Y,并且指向了彼此.有关X.h的信息,请参阅下面的代码,Y.h与所有X和Y的互换完全相同.但是,此代码在我的方法Connect中出错(错误C2027:使用未定义类型’Y’).在X.h中,我已经向前声明了类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;
};
解决方法:
不要在类体中包含方法体.编写这两个类,在两个类完成后,编写方法实现:
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方法时,可以获得有关如何将类对象放置在内存中的完整信息.并且作为类体中的方法和内联声明的方法都将以相同的方式内联,性能也将是相同的.
唯一的缺点是你不能以合理的方式将这两个类分成两个标题.
标签:c,forward-declaration 来源: https://codeday.me/bug/20190930/1835854.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。