如何从另一个 class 访问朋友功能?
How to access friend function from another class?
当我编译下面的代码时,
#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++ projects\private 访问 specifier\main.cpp|6|错误:'int class1::var' 是私有的|
G:\C++ projects\private 访问 specifier\main.cpp|16|错误:在此上下文中|
G:\C++ projects\private access specifier\main.cpp|32|error: no match for 'operator<<' (operand types are 'std::basic_ostream' and 'void')|
这里我需要访问一个私有成员 'var' form class1 和 class2 中的函数 'getter'
我知道还有另一种更简单的方法来获取和设置值,但我来这里是为了了解友元函数的工作原理。
请澄清我的疑问,因为我是 C++ 的新手
这个
friend void getter(class1 o1);
授予好友访问 class1
的私有权限给名为 getter
的免费函数。您的代码中没有这样的功能。 class1
可以像这样让朋友访问 class2
:
class class2;//forward declaration
class class1{
int var;
public:
void setter(int);
friend class2;
};
这也无法编译:cout <<"value:\n"<<o2.getter(o1);
。我想你想要 getter
到 return 值:
class class2{
public:
int getter(const class1& o1)
{
return o1.var;
}
};
在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
returns void
你不能传递给 ostream
.
其他答案告诉您如何以最简单(也可能是最好)的方式解决问题。但是,如果您真的只想将好友权限授予单个成员函数,则需要做更多的工作:
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;
}
当我编译下面的代码时,
#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++ projects\private 访问 specifier\main.cpp|6|错误:'int class1::var' 是私有的| G:\C++ projects\private 访问 specifier\main.cpp|16|错误:在此上下文中| G:\C++ projects\private access specifier\main.cpp|32|error: no match for 'operator<<' (operand types are 'std::basic_ostream' and 'void')|
这里我需要访问一个私有成员 'var' form class1 和 class2 中的函数 'getter' 我知道还有另一种更简单的方法来获取和设置值,但我来这里是为了了解友元函数的工作原理。 请澄清我的疑问,因为我是 C++ 的新手
这个
friend void getter(class1 o1);
授予好友访问 class1
的私有权限给名为 getter
的免费函数。您的代码中没有这样的功能。 class1
可以像这样让朋友访问 class2
:
class class2;//forward declaration
class class1{
int var;
public:
void setter(int);
friend class2;
};
这也无法编译:cout <<"value:\n"<<o2.getter(o1);
。我想你想要 getter
到 return 值:
class class2{
public:
int getter(const class1& o1)
{
return o1.var;
}
};
在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
returns void
你不能传递给 ostream
.
其他答案告诉您如何以最简单(也可能是最好)的方式解决问题。但是,如果您真的只想将好友权限授予单个成员函数,则需要做更多的工作:
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;
}