C++学习记录-面向对象-成员函数做友元问题

以下成员函数做友元代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class chara {

friend void search::printinfo(chara* ch);//添加成员函数为友元

public:
string name;
private:
string weapon;
};

class search {
public:
void printinfo(chara* ch)
{
cout << "角色:" << ch->name << endl;
cout << "使用武器:" << ch->weapon << endl;
}
};

编译器会报错。原因是先在chara类中声明search成员函数友元时,编译器并不知道search是什么,search类里面有什么,因此会出错。修改如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class chara;//声明chara类

class search {
public:
void printinfo(chara* ch)
{
cout << "角色:" << ch->name << endl;
cout << "使用武器:" << ch->weapon << endl;
}
};

class chara {
friend void search::printinfo(chara* ch);
public:
string name;
private:
string weapon;
};

此时还是报错了

1>D:\Work\C艹练习\练手\Project1\Project1\源.cpp(35,1): error C2027: 使用了未定义类型“chara”
1>D:\Work\C艹练习\练手\Project1\Project1\源.cpp(29): message : 参见“chara”的声明
1>D:\Work\C艹练习\练手\Project1\Project1\源.cpp(36,1): error C2027: 使用了未定义类型“chara”
1>D:\Work\C艹练习\练手\Project1\Project1\源.cpp(29): message : 参见“chara”的声明

原因:

上面的程序使用了前向声明(可以声明一个类而不定义它,这个声明被称为前向声明(forward declaration)。)

在声明之后,定义之前,类是一个不完全类型(incompete type),即已知向前声明过的类是一个类型,但不知道包含哪些成员。
不完全类型只能以有限方式使用,不能定义该类型的对象,不完全类型只能用于定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数。

因此代码应修改如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class search;
class chara;
//声明两个类。

class search {
public:
void pr(chara* ch);//声明一个成员函数,但先不定义它。
};

class chara {
friend void search::printinfo(chara* ch);//先声明search类的成员函数pr为友元。
public:
string name;
private:
string weapon;
};

//最后在chara的后面定义pr函数。
void search::pr(chara* ch)
{
cout << "角色:" << ch->name << endl;
cout << "使用武器:" << ch->weapon << endl;
}

可以通过单独编译和向前声明方法实现两个类之间相互引用成员,以后再来