为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我用友元成员函数,VS会报错?

http://img1.sycdn.imooc.com//5711a1b600013bbf04060509.jpg为什么会报错呢

正在回答

5 回答

大神们,有没有使用类外定义的代码给贴一份?每次我把类定义到单独的文件中之后,即使把定义的文件先include进来,还是过不了编译。比如就这个例子:

把Coordinate和Circle分别定义,这样会有4个文件 ,

Coordinate.h

Coordinate.cpp

Circle.h

Circle.cpp


我在Coordinate.h声明友元,包含circle.h;

以circle.h中声明有Coordinate这个类,感觉差不多了吧,就是过不了编译。


如果在Circle::printXY(Coordinate &t)中不调用t.x或t.y的值,就能够编译。一旦调用就 

invalid use of incomplete type 'class Coordinate'|

forward declaration of 'class Coordinate'|


0 回复 有任何疑惑可以回复我~

因为运行到第五行 friend void Circle::printXY(Coordinate &t)时,其中的Circle类还没定义,所以编译器无法识别。

你可以这样试一下:

从第三行开始,先写一行前置声明 class Coordinate;

然后先定义Circle类:class Circle{(完整定义,printXY函数放在类外实现)};

再定义Coordinate类:class Coordinate{(完整定义)};

如下:

#include<iostream>

using namespace std;


class Coordinate;

class Circle

{

public:void printXY(Coordinate &t);

};

class Coordinate

{

friend void Circle::printXY(Coordinate &t);

public: 

Coordinate(int _x,int _y)

{

x = _x;

y = _y;

}

private:

int x,y;

};


void Circle::printXY(Coordinate &t)

  {

  cout<<t.x<<","<<t.y;

  }

int main()

{

Coordinate coor(3,5);

Circle circle;

circle.printXY(coor);

system("pause");

return 0;

}

http://img1.sycdn.imooc.com//577a117800012ac308170461.jpg

1 回复 有任何疑惑可以回复我~
#1

王业

能不能来个类外定义的例子?看看我后面的回复。或者这个问题:http://www.imooc.com/qadetail/188337
2016-12-17 回复 有任何疑惑可以回复我~

注意顺序,我也是这种情况,喜欢都写在一个文件下,不喜欢类外定义,这是我的代码,希望对你有帮助

# include<iostream>

using namespace std;

class Time;       //一定要注意顺序

class Match{

public:

void printTime(Time &t);  //这里要用到Time,所以声明 

                       //这里不能函数体,要在后面定义


};

class Time{


friend void Match::printTime(Time &t);

public:

Time(int x, int y, int z){

m_iHour = x;

m_iMinute = y;

m_iSecond = z;

}

private:

int m_iHour;

int m_iMinute;

int m_iSecond;

};

int main(){

Time t(19,45,5);

Match m;

m.printTime(t);

system("pause");

return 0;

}

void Match::printTime(Time &t){


cout << t.m_iHour << ":" << t.m_iMinute << ":" << t.m_iSecond << ":" << endl;

}


0 回复 有任何疑惑可以回复我~

现在应该都不好使了  

57122c5d00016e4305000682.jpg

57122c5e00016e0e05000263.jpg


0 回复 有任何疑惑可以回复我~

再跑一遍

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
C++远征之模板篇
  • 参与学习       91156    人
  • 解答问题       318    个

本C++教程力求即学即会,所有知识以实践方式讲解到操作层面

进入课程

为什么我用友元成员函数,VS会报错?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信