我有一个了解朋友功能的演示程序。我想我遇到了与前向声明相关的错误。
我有一个点类,它有 x & y 坐标。线类有两个点类对象。现在我在线类中有一个函数,它将计算线的斜率。
这是我的程序:
#include <iostream>
using namespace std;
class point
{
int x,y;
public:
point(int,int);
point();
friend float line::slope();
};
point::point(int a, int b)
{
x=a;
y=b;
}
point::point()
{
}
class line
{
point p1,p2;
public:
line(point,point);
float slope();
};
line::line(point p1, point p2)
{
this->p1=p1;
this->p2=p2;
}
float line::slope()
{
float s;
s=((float)p2.y-p1.y)/(p2.x-p1.x);
return s;
}
int main()
{
float sl;
point obj(5,10);
point obj1(4,8);
line obj3(obj,obj1);
sl=obj3.slope();
cout<<"\n slope:"<<sl;
return 0;
}
由于以下原因,它给了我关于前向声明的编译器错误:
当我尝试首先定义我的线类时,它不知道点类。即使我转发声明点类,这也不足以创建点类的对象,编译器应该知道点类的大小,因此知道整个类本身。通过此答案中的解释理解它:https ://stackoverflow.com/a/5543788
如果我首先定义点类,它需要知道友函数斜率,因此需要知道类线。所以我尝试在定义点类之前像这样为线类和斜率函数提供前向声明:
类线;
float line::slope(); class point { int x,y; public: point(int,int); point(); friend float line::slope(); };
现在这给了我以下错误:
friend1.cpp:5: error: invalid use of incomplete type ‘struct line’
friend1.cpp:4: error: forward declaration of ‘struct line’
friend1.cpp:13: error: invalid use of incomplete type ‘struct line’
friend1.cpp:4: error: forward declaration of ‘struct line’
friend1.cpp: In member function ‘float line::slope()’:
friend1.cpp:9: error: ‘int point::y’ is private
friend1.cpp:43: error: within this context
friend1.cpp:9: error: ‘int point::y’ is private
friend1.cpp:43: error: within this context
friend1.cpp:9: error: ‘int point::x’ is private
friend1.cpp:43: error: within this context
friend1.cpp:9: error: ‘int point::x’ is private
friend1.cpp:43: error: within this context
.3. 接下来我尝试将point.h和point.cpp中的点类和line.h和line.cpp中的线类分开。但是这里仍然存在相互依赖。
虽然这在理论上应该是可能的,但我无法弄清楚如何让它工作。
寻找答案。
谢谢,
拉吉
PS:这个程序是为了单独演示友元函数的使用。在友元函数有两种类型的情况下,这是处理第二种类型的努力:
- 友函数是独立的。
- 作为另一个类的成员的朋友函数。
因此,在这种情况下排除了使用朋友类。