为什么我用友元成员函数,VS会报错?
为什么会报错呢
为什么会报错呢
2016-04-16
大神们,有没有使用类外定义的代码给贴一份?每次我把类定义到单独的文件中之后,即使把定义的文件先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'|
因为运行到第五行 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;
}
注意顺序,我也是这种情况,喜欢都写在一个文件下,不喜欢类外定义,这是我的代码,希望对你有帮助
# 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;
}
举报