У меня есть демонстрационная программа для понимания функции друга. Думаю, я застрял с ошибками, связанными с предварительным объявлением.
У меня есть класс точек, который имеет координаты 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: эта программа представляет собой попытку продемонстрировать использование только функций друзей. Там, где дружественные функции бывают двух типов, мы пытаемся справиться со вторым из них:
- Дружественные функции, которые независимы.
- Дружественные функции, которые являются членами другого класса.
Таким образом, использование дружественных классов в этом случае исключено.
friend class line;
. - person n. 1.8e9-where's-my-share m.   schedule 02.08.2012friend class
просто означает, что все функции-члены класса являются дружественными. - person n. 1.8e9-where's-my-share m.   schedule 02.08.2012