[英]friend class with forward class declaration does not compile
这是一个基本程序,用于了解如何在C ++中使用friend class
。
xxx
类具有使用friend
yyy
类对象。 由于类yyy
是在类xxx
之后定义的,因此我已使用前向声明声明了类yyy
。
#include<iostream>
using std::cout;
using std::endl;
class yyy; //Forward Declaration of class yyy
class xxx{
private:
int a;
public:
xxx(){a=20;yyy y2;y2.show();} //Error//
void show(){cout<<"a="<<a<<endl;}
friend class yyy; //Making class yyy as freind of class xxx
};
class yyy{
private:
int b;
public:
yyy(){b=10;}
void show(){cout<<"b="<<b<<endl;}
};
int main(int argc, char *argv[])
{
xxx x1; //creating xxx object and calling constructor
x1.show();
return 0;
}
当我编译程序时,出现此错误:
错误:聚合'yyy y2'类型不完整,无法定义
我提到了此链接递归朋友类 ,有人回答过像这样https://stackoverflow.com/a/6158833/2168706
我正在采用这种方法,但是仍然无法解决问题。 请提供解决方案(如果存在),如果我在代码中的任何时候错了,请告诉我。
您正在此处实例化不完整类型yyy
的对象y2
:
{ a = 20; yyy y2; y2.show(); }
将构造函数的实现yyy
类的定义下方:
class yyy;
class xxx {
private:
int a;
public:
xxx();
void show() { cout << "a=" << a << endl; }
friend class yyy;
};
class yyy {
private:
int b;
public:
yyy() { b = 10; }
void show() { cout << "b=" << b << endl; }
};
xxx::xxx() { a = 20; yyy y2; y2.show(); } // No error
结果,此时yyy
已经定义,您可以实例化y2
。
为了给您一个合理的解释,为什么您的变体不起作用:当您实例化具有自动存储持续时间 (在堆栈上)的对象(如yyy y2;
,编译器必须在编译时知道应为y2
保留多少内存。 由于yyy
类型不完整(仅在实例化时才被向前声明),编译器将丢失并报告错误。
注意:最佳实践当然是通过将定义移到头文件( .hpp
)和将实现移到源文件( .cpp
)来分离类及其实现的定义。 不要忘记适当地包含标题。 我不想在这里给您一个示例,因为它是非常基本的内容,任何C ++书籍或教程都应涵盖。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.