Есть две структуры, реализующие геометрические понятия точки и вектора. Для инициализации вектора требуется две точки. Аналогично присутствует операция сложения точки и вектора через перегрузку оператора +. Компилятор ругается на отсутствие структуры Vector в перегрузке, что понятно, т.к. она реализована после. Каким образом предварительно объявить структуру Vector. (struct Vector;) не работает. Или тут ошибка самой логики объявления.
struct Vector;
struct Point
{
int X;
int Y;
[***]
Point operator + (const Vector& ab)
{
this->X += ab.X;
this->Y += ab.Y;
return *this;
}
};
struct Vector
{
int X;
int Y;
[***]
Vector(Point& a, Point& b)
{
X = b.X - a.X;
Y = b.Y - a.Y;
}
};
С логикой предварительного объявления все в порядке. Просто определение вашего оператора надо делать там, где определения обоих классов уже полностью известны. Т.е. не внутри первого класса, а снаружи - после обоих определений классов, как inline
inline Point Point::operator + (const Vector& ab)
{
this->X += ab.X;
this->Y += ab.Y;
return *this;
}
Внутри первого класса должно остаться только объявление оператора.
Однако реализовано у вас тут нечто странное. Бинарный оператор +, который вдруг ни с того ни с сего портит (модифицирует) свой первый операнд - это ужасно. Зачем вам понадобился такой странный оператор?
Вынесите определение оператора вне класса, после объявлений обоих классов. В классе оставьте только объявление оператора, без тела. Примерно так:
struct Vector;
struct Point
{
int X;
int Y;
[***]
Point operator + (const Vector& ab);
};
struct Vector
{
int X;
int Y;
[***]
Vector(Point& a, Point& b)
{
X = b.X - a.X;
Y = b.Y - a.Y;
}
};
Point Point::operator + (const Vector& ab);
{
X += ab.X;
Y += ab.Y;
return *this;
}
Проблема в том, что для того, чтобы разместить какой-то объект в классе, компилятор должен знать его размер. Поэтому вы не можете запихнуть еще не описанный объект в ваш класс - никак... кроме указателя или ссылки. Дело в том, что их размеры всегда одинаковы, независимо от объектов, на какие они указывают. Что же касается указания имени класса, для объявления указателя (или ссылки) на него, то просто пишите
class my_class;
перед классом, в котором будете размещать указатель на my_class.
UPD говоря класс - я имел ввиду понятие в общем, а не конкретно class
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости