当我编译以下代码时,
#include <iostream>
using namespace std;
class class1;//forward declaration
class class1{
int var;
public:
void setter(int);
friend void getter(class1 o1);
};
class class2{
public:
void getter(class1 o1)
{
o1.var;
}
};
void class1::setter(int v)
{
var =v;
}
int main()
{
int val;
class1 o1;
class2 o2;
cout<<"Enter value\n";
cin>>val;
o1.setter(val);
cout <<"value:\n"<<o2.getter(o1);
return 0;
}
我遇到以下错误, G:\ C ++项目\私有访问说明符\ main.cpp | 6 |错误:“ int class1 :: var”是private | G:\ C ++项目\专用访问说明符\ main.cpp | 16 |错误:在此上下文中| G:\ C ++项目\专用访问说明符\ main.cpp | 32 |错误:“ operator <<”不匹配(操作数类型为“ std :: basic_ostream”和“ void”)|
在这里,我需要使用class2中的函数“ getter”来访问class1的私有成员“ var” 我知道还有另一种更简单的方法来获取和设置值,但是我在这里了解朋友功能的工作原理。 请澄清我的疑问,因为我是C ++的新手
答案 0 :(得分:3)
其他答案告诉您如何以最简单(也可能是最好)的方式解决问题。但是,如果您真的只想将朋友特权授予单个成员函数,则需要做更多的工作:
class class1;
// To befriend a member function of class2, it must be defined before the friendship declaration
class class2{
public:
int getter(class1 o1);
};
class class1{
int var;
public:
void setter(int);
//correct syntax mentions the class name
friend int class2::getter(class1 o1);
};
void class1::setter(int v)
{
var =v;
}
// definition of this function must be after class1 definition,
// so it can know that `class1` has member `var`
// therefore it cannot be defined inline in class
int class2::getter(class1 o1)
{
return o1.var;
}
答案 1 :(得分:1)
此
friend void getter(class1 o1);
允许朋友访问class1
的私人帐户,以使用名为getter
的免费功能。您的代码中没有此类功能。 class1
可以让朋友访问class2
,如下所示:
class class2;//forward declaration
class class1{
int var;
public:
void setter(int);
friend class2;
};
这也不会编译:{{1}}。我想您希望cout <<"value:\n"<<o2.getter(o1);
返回值:
getter
答案 2 :(得分:1)
在class1
中,此声明:
friend void getter(class1 o1);
说函数getter
是class1
的朋友。
但是,您希望class2
的成员函数有权访问class1
成员。在这种情况下,您可以授予class2
本身的友情,这将允许class2
的成员函数访问class1
的私有成员:
class class2; // forward declaration
class class1
{
// ...
friend class2;
};
另外,请注意这一行:
cout << "value:\n" << o2.getter(o1);
由于class2::getter
返回void
,因此无法编译,您无法将其传递给ostream
。