有可能吗?
class sample {
private:
int x;
public:
friend void fun();
};
friend
函数没有参数!
在我看来不可能
因为朋友的功能不是"会员"课程 所以我们不能用类对象调用
像:
sample s;
s.fun();
答案 0 :(得分:16)
是的,你可以:
void fun()
{
sample s;
s.x++; // OK, fun() is a friend of sample
}
或
sample globalSample; // yikes, a global variable
void fun()
{
int i = globalSample.x; // OK, fun() is a friend of sample
}
答案 1 :(得分:4)
答案 2 :(得分:3)
可以没有参数的朋友函数。您需要另一种方法来访问类示例的对象。不要忘记,友元函数还允许您访问类示例的私有静态变量,以防您需要
答案 3 :(得分:3)
sample
的全局实例。 <{1}}也可能创建fun
的实例并获取其私有权。
函数创建实例和用它做事的工作示例:
sample
全局实例的示例:
#include <iostream>
class sample {
private:
int x;
public:
friend void fun();
};
void fun()
{
sample s;
s.x = 555555555;
std::cout << s.x;
}
int main(){
fun();
return 0;
}
私有静态成员的示例:
#include <iostream>
#include <string>
class sample {
private:
int x;
public:
friend void fun();
};
sample s;
void fun()
{
s.x = 555555555;
std::cout << s.x;
}
int main(){
fun();
return 0;
}
答案 4 :(得分:2)
是的但是对于变量,你需要它们是全局的。您的案例中sample
类型的全局对象。或者在函数内部创建对象可能在fun()
的定义中。
sample globalObject;
void fun()
{
globalObject.x++; //this will work as fun() is friend function of sample.
}
答案 5 :(得分:1)
当然有可能。看来你想知道为什么会这样做。例如,它可以访问静态私有成员变量。或者它可以通过某种方式访问它获得的对象的私有成员(单例,全局(容器)对象,...)
答案 6 :(得分:1)
可能,拥有没有参数的朋友函数。它很少使用。
答案 7 :(得分:0)
sample s;
s.fun();
这无论如何都行不通,因为C ++中的“友谊”只是提升对私人/受保护成员的访问限制。朋友不是班级成员,因此您无法拨打s.fun()。
但是你可以声明你所描述的朋友函数,并且从该函数中你可以访问样本类的私有成员。
答案 8 :(得分:0)
友元方法可能很有用,因为对私有/受保护数据的访问仅限于指定的那些方法。此方法有参数或返回类型无关紧要。
template <class T>
class CLinkedListNode {
public:
CLinkedListNode(CLinkedList<T>* Parent) : _Parent(Parent) {
}
protected:
CLinkedListNode * _Next;
T _Data;
CLinkedList<T>* _Parent;
friend CLinkedListNode<T>* CLinkedList<T>::find(); // Only CLinkedList<T>::find() may access data members
friend void sort(); // All sort methods may access data members
};
假设有一个类CLinkedList,其find()
方法能够访问CLinkedListNode的所有数据成员。
template <class T>
class CLinkedList {
// ...
CLinkedListNode<T>* find() {
CLinkedListNode<T>* Node = new CLinkedListNode<T>(this);
CLinkedListNode<T>* Find = Node->_Next;
while (Find->_Next) {
// Do something
Find = Find->_Next;
}
// ...
return Node;
}
};