好吧,我声明了一个朋友函数,它位于:
// user-proc.h
class cregister{
private:
levy user; // typedef struct
int testp;
public:
friend void test();
cregister(levy &tmp);
levy getUser();
void displayUser(levy &);
};
然后我将其定义为:
// user-proc.cpp
void test()
{
cout << "test" << endl;
}
我试图调用main函数,但它告诉我它并没有在这个范围内声明。我做了一些研究,但我发现,他们说朋友类型并不完全是声明,你也必须在类外定义它。我试过了,然后正常情况下错误消失了,但碰巧朋友功能无法访问私人成员。
EDIT:我使用了void test();在类定义之前,并使用对象访问私有成员。它就这样解决了
您需要有两个声明:一个是普通函数原型声明,另一个在类中作为友元声明。
// user-proc.h
void test(); // Added prototype
class cregister{
private:
levy user; // typedef struct
int testp;
public:
friend void test(); // Friend declaration still here
cregister(levy &tmp);
levy getUser();
void displayUser(levy &);
};
这里似乎声明了两个test()
函数;一个在类中,一个(带定义)在cpp文件中。
仅在类中声明的test()
实际上只能通过ADL访问,这在这里不起作用,因为它不需要类类型的参数。
在类定义之前添加void test();
的声明应使类的内部在test
函数中可用。
// user-proc.h
void test();
class cregister{
// redacted...
public:
friend void test();
};
虽然test()
可以访问这里的私有成员,但除非它声明要使用的类的实例(有效对象),否则该函数不会太有用考虑为函数添加一个参数,比如void test(cregister& arg);
(在这里ADL会起作用)。我推断这里的函数是专门用于测试的,所以上面的内容可能不适用,但在一般情况下它可能有用。