在其他类定义的友元函数中访问类私有成员时出现编译错误
问题分析与解决
你的问题核心是:在cl1中定义setx函数时,cl2还只是前置声明,编译器不知道它的私有成员x的存在。前置声明只能告诉编译器“有这么个类”,但没法提供类的内部结构信息,所以直接在cl1里写obj->x会报错。
解决方法很简单:把setx的函数定义移到cl2的完整定义之后,这样编译器就能看到cl2的x成员了。
修正后的代码如下:
#include <iostream> using namespace std; class cl2; // 前置声明 class cl1 { int y; public: cl1(int num) { y = num; } void setx(cl2 *obj, int num); // 只声明,不定义 }; class cl2 { int x; public: cl2(int num) { x = num; } friend void cl1::setx(cl2 *obj, int num); int getx() { return x; } }; // 现在cl2已经完整定义,可以访问它的私有成员x了 void cl1::setx(cl2 *obj, int num) { obj->x = num; } int main() { cl2 objcl2(2); cl1 objcl1(1); objcl1.setx(&objcl2, 20); cout << objcl2.getx() << "\n\n"; system("pause"); return 0; }
另外注意代码里要加上#include <iostream>和using namespace std;,不然cout会编译报错,你原来的代码里漏了这部分。
内容的提问来源于stack exchange,提问作者Tobías Milano
相关产品推荐
相关产品推荐

