友達の機能を理解するためのデモプログラムがあります。前方宣言に関連するエラーで立ち往生していると思います。
xとyの座標を持つポイントクラスがあります。ラインクラスには、ポイントクラスの2つのオブジェクトがあります。これで、線の傾きを計算する線クラスの関数ができました。
これは私のプログラムです:
#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:このプログラムは、フレンド関数だけの使用法を示すための取り組みです。フレンド関数が2つのタイプである場合、これはこの種の2番目に対処するための取り組みです。
- 独立したフレンド機能。
- 別のクラスのメンバーであるフレンド関数。
したがって、この場合、フレンドクラスの使用は除外されます。