为什么朋友类不需要转发声明但成员函数需要?
朋友班:
class String0{
friend class String;
private:
int size = 0;
string s;
};
class String {
public:
string combine(const string &s1);
private:
int size = 0;
string s;
};
会员朋友:
class String {
public:
string combine(const string &s1); //why need this?
private:
int size = 0;
string s;
};
class String0 {
friend string String::combine(const string &);
};
String String::combine(const string &s1){...}
在使用类和非成员函数之前,不需要声明它们 在朋友的声明中。 但为什么会员功能需要?
答案 0 :(得分:2)
友元类/函数声明本身就是一个声明,并且向前声明了类/函数。你说对了。
现在,如果您可以在class A
中将friend
的成员函数声明为class B
,则表示您正在更改class A
的界面。
想象一下我做了
class foo {
public:
friend void std::vector<int>::fun();
};
我是否向std::vector<int>
添加了一个功能?
答案 1 :(得分:1)
标准给出了一个例子:
13.3朋友 [class.friend] 3 /
class C; typedef C Ct; class X1 { friend C; // OK: class C is a friend }; class X2 { friend Ct; // OK: class C is a friend friend D; // error: no type-name D in scope friend class D; // OK: elaborated-type-specifier declares new class };
friend class D
前锋声明class D
并与之建立友情关系。