Создать абстрактный класс Point (точка). На его основе создать классы ColoredPoint и Line. На основе класса Line создать класс ColoredLine и класс PolyLine (многоугольник). Все классы должны иметь виртуальные методы установки и получения значений всех координат, а также изменения цвета и получения текущего цвета.
Создать класс Picture, содержащий массив/параметризованную коллекцию объектов этих классов в динамической памяти. Предусмотреть возможность вывода характеристик объектов списка. Написать демонстрационную программу, в которой будут использоваться все методы классов.
Дополнительное задание: дополнить класс методами сортировки по некоторому критерию, вывода в файл и считывания из файла.

kulisenok kulisenok    2   17.04.2020 13:19    41

Ответы
munur munur  06.01.2024 09:25
Хорошо, давайте начнем с создания абстрактного класса Point. Абстрактный класс - это класс, который не может быть создан сам по себе, а может только служить базовым классом для других классов. Он имеет хотя бы одну виртуальную функцию, и мы не можем создавать экземпляры (объекты) этого класса непосредственно.

```c++
#include
using namespace std;

class Point {
protected:
int x; // координата x
int y; // координата y
public:
virtual void setCoordinates(int x, int y) = 0; // абстрактная функция установки координат
virtual void getCoordinates() = 0; // абстрактная функция получения координат
virtual void setColor(string color) = 0; // абстрактная функция установки цвета
virtual string getColor() = 0; // абстрактная функция получения цвета
virtual ~Point() {} // виртуальный деструктор
};
```

Здесь мы объявили класс Point с двумя защищенными переменными x и y, представляющими координаты точки. Затем мы объявляем четыре виртуальных функции: `setCoordinates`, `getCoordinates`, `setColor` и `getColor`. Эти функции будут переопределены в производных классах, чтобы обрабатывать соответствующие значения.

Далее, давайте создадим класс ColoredPoint, который наследуется от класса Point:

```c++
class ColoredPoint : public Point {
private:
string color; // цвет точки
public:
void setCoordinates(int x, int y) override { // переопределение функции установки координат
this->x = x;
this->y = y;
}

void getCoordinates() override { // переопределение функции получения координат
cout << "Coordinates: (" << x << ", " << y << ")" << endl;
}

void setColor(string color) override { // переопределение функции установки цвета
this->color = color;
}

string getColor() override { // переопределение функции получения цвета
return color;
}
};
```

В классе ColoredPoint мы добавляем дополнительную переменную color для представления цвета точки. Мы также переопределяем все четыре виртуальные функции класса Point.

Теперь давайте создадим класс Line, который также наследуется от класса Point:

```c++
class Line : public Point {
protected:
int x2; // вторая координата x
int y2; // вторая координата y
public:
void setCoordinates(int x1, int y1, int x2, int y2) { // функция установки координат линии
this->x = x1;
this->y = y1;
this->x2 = x2;
this->y2 = y2;
}

void getCoordinates() { // функция получения координат линии
cout << "Coordinates: (" << x << ", " << y << ") - (" << x2 << ", " << y2 << ")" << endl;
}

void setColor(string color) override { // переопределение функции установки цвета
cout << "Setting color of line to: " << color << endl;
}

string getColor() override { // переопределение функции получения цвета
// здесь могут быть дополнительные действия, но в данном примере возвращаем пустую строку
return "";
}
};
```

В классе Line мы добавляем две дополнительные переменные (x2 и y2) для представления вторых координат линии. Мы также переопределяем функции установки и получения координат.

Теперь создадим класс ColoredLine, который наследуется от класса Line:

```c++
class ColoredLine : public Line {
private:
string color; // цвет линии
public:
void setCoordinates(int x1, int y1, int x2, int y2) { // переопределение функции установки координат линии
this->x = x1;
this->y = y1;
this->x2 = x2;
this->y2 = y2;
}

void getCoordinates() { // переопределение функции получения координат линии
cout << "Coordinates: (" << x << ", " << y << ") - (" << x2 << ", " << y2 << ")" << endl;
}

void setColor(string color) { // переопределение функции установки цвета линии
this->color = color;
cout << "Setting color of line to: " << color << endl;
}

string getColor() { // переопределение функции получения цвета линии
return color;
}
};
```

В классе ColoredLine мы снова добавляем переменную color для представления цвета линии. Мы также переопределяем функции установки и получения координат, а также функции установки и получения цвета.

Теперь давайте создадим класс PolyLine, который также наследуется от класса Line:

```c++
class PolyLine : public Line {
public:
// для многоугольника можно использовать функции класса Line
};
```

Класс PolyLine наследует все функции и переменные от класса Line, поскольку многоугольник - это всего лишь линия с более чем двумя точками.

Далее создадим класс Picture, который содержит массив/параметризованную коллекцию объектов классов Point, ColoredPoint, Line, ColoredLine и PolyLine в динамической памяти. Мы также предусмотрим возможность вывода характеристик объектов списка:

```c++
#include

class Picture {
private:
vector objects; // коллекция указателей на объекты
public:
void addObject(Point* object) { // функция добавления объекта
objects.push_back(object);
}

void printObjects() { // функция печати объектов
for (const auto& object : objects) {
object->getCoordinates();
object->setColor("red");
cout << endl;
}
}
};
```

В классе Picture мы используем параметризованную коллекцию `vector`, чтобы хранить указатели на объекты класса Point. Мы добавляем функцию `addObject`, которая добавляет объекты в коллекцию. Мы также добавляем функцию `printObjects`, которая выводит характеристики объектов в коллекции, вызывая соответствующие функции установки цвета и получения координат.

Теперь давайте создадим демонстрационную программу для использования всех методов классов:

```c++
int main() {
Picture picture;

Point* coloredPoint = new ColoredPoint();
coloredPoint->setCoordinates(1, 1);
coloredPoint->setColor("blue");
picture.addObject(coloredPoint);

Line* coloredLine = new ColoredLine();
coloredLine->setCoordinates(1, 1, 2, 2);
coloredLine->setColor("green");
picture.addObject(coloredLine);

Line* polyLine = new PolyLine();
polyLine->setCoordinates(1, 1, 2, 2);
picture.addObject(polyLine);

picture.printObjects();

delete coloredPoint;
delete coloredLine;
delete polyLine;

return 0;
}
```

В этой программе мы создаем объект класса Picture и добавляем в него объекты разных типов (ColoredPoint, ColoredLine и PolyLine). Мы также вызываем функцию `printObjects` для вывода их характеристик. Затем, после завершения программы, мы освобождаем память, выделенную для объектов.

Дополнительное задание предлагает добавить классу Picture методы сортировки по некоторому критерию, вывода в файл и считывания из файла. Ниже приведены примеры этих методов:

```c++
#include
#include

bool compareByX(Point* a, Point* b) { // функция сравнения по координате x
return a->x < b->x;
}

void Picture::sortObjectsByX() { // функция сортировки объектов по координате x
sort(objects.begin(), objects.end(), compareByX);
}

void Picture::saveToFile(const string& filename) { // функция сохранения объектов в файл
ofstream file(filename);

if (file.is_open()) {
for (const auto& object : objects) {
file << "(" << object->x << ", " << object->y << ")" << endl;
}

file.close();
}
}

void Picture::loadFromFile(const string& filename) { // функция загрузки объектов из файла
ifstream file(filename);

if (file.is_open()) {
int x, y;
while (file >> x >> y) {
Point* point = new ColoredPoint();
point->setCoordinates(x, y);
addObject(point);
}

file.close();
}
}
```

Мы добавляем функцию `compareByX`, которая сравнивает две точки по координате x. Затем мы добавляем методы `sortObjectsByX`, `saveToFile` и `loadFromFile` в класс Picture. `sortObjectsByX` сортирует объекты в коллекции по координате x. `saveToFile` сохраняет все объекты в файл в формате `"(x, y)"`. `loadFromFile` загружает объекты из файла и добавляет их в коллекцию.

Теперь у нас есть полноценная программа, которая создает и использует классы Point, ColoredPoint, Line, ColoredLine, PolyLine и Picture, а также предоставляет возможность сортировки объектов, сохранения их в файл и загрузки из файла.
ПОКАЗАТЬ ОТВЕТЫ
Другие вопросы по теме Информатика