Пишу абстрактный класс символьного дифференцирования и возникла проблема с объявлением классов sin и cos, если сначала объявляю cos, то не могу использовать sin в методе diff, если сначала объявляю sin, то не могу использовать cos. Ошибка: использование неопределенного типа "Sin"
Как решить эту проблему?
class Cos : public Expression
{
private:
Expression *d1;
public:
friend class Sin;
Cos(Expression *L1) : d1(L1) {}
Expression *diff()
{
return new Mul(new Sin(d1), d1->diff());
}
void print(){}
};
class Sin : public Expression
{
private:
Expression *d1;
public:
friend class Cos;
Sin(Expression *L1): d1(L1) {}
Expression *diff()
{
return new Mul(new Cos(d1), d1->diff());
}
void print(){}
};
Ответ
В определении функций diff требуется завершенный класс, раз уж вы используете его конструктор. Так что вы должны в объявлениях классов только объявить функции-члены diff, а вот определять их (писать тело) - вне классов.
Типа
class Cos : public Expression
{
private:
Expression *d1;
public:
friend class Sin;
Cos(Expression *L1) : d1(L1) {}
Expression *diff();
void print(){}
};
Потом - такой же Sin, а уж только потом, вне классов, писать
Expression *Cos::diff()
{
return new Mul(new Sin(d1), d1->diff());
}
Комментариев нет:
Отправить комментарий