C++无用友函数声明

C++ Useless Friend Function Declaration

本文关键字:声明 函数 无用 C++      更新时间:2023-10-16

好吧,我声明了一个朋友函数,它位于:

// 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会起作用)。我推断这里的函数是专门用于测试的,所以上面的内容可能不适用,但在一般情况下它可能有用。