Другие языки программирования и технологии

нужно исправить программу

В программе мы создаем и заполняем динамический массив объектов класса. Затем проводим сортировку массива по элементу x и выводим отсортированный массив.
Нужно исправить программу:
#include
#include
#include

using namespace std;

class P
{
public:
P(int x, int y)
{
this->x = x;
this->y = y;
};
/*void print()
{
cout << x << y << endl;
}*/

private:
int x;
int y;
};

int main()
{
int size;
cin >> size;
P *arr = new P[size];
for (int i = 0; i < size; i++) {
cin >> P arr[i].x;
cin >> P arr[i].y;
};

P temp(); // временная переменная для обмена элементов местами

// Сортировка массива пузырьком
for (int i = 0; i < size - 1; i++) {
for (int j = 0; j < size - i - 1; j++) {
if (arr[j].x > arr[j + 1].x) {
// меняем элементы местами
temp.x = arr[j].x;
arr[j].x = arr[j + 1].x;
arr[j + 1].x = temp.x ;
}
}
}

// Вывод отсортированного массива на экран
for (int i = 0; i < size; i++) {
cout << arr[i].x << " ";
}

delete [] arr;

}
}
#include <iostream>
using namespace std;
class Point {
public:
Point() : x_(0), y_(0) {}
Point(const int x, const int y) : x_(x), y_(y) {}
private:
int x_;
int y_;
friend bool operator>(const Point& a, const Point& b) {
if (a.x_ > b.x_) return true;
if (a.x_ == b.x_ && a.y_ > b.y_) return true;
return false;
}
friend ostream& operator<<(ostream& out, const Point& p) {
out << '[' << p.x_ << ", " << p.y_ << ']';
return out;
}
friend istream& operator>>(istream& in, Point& p) {
cout << "x: "; in >> p.x_;
cout << "y: "; in >> p.y_;
return in;
}
};
void bubble(Point* pp, const size_t size) {
for (int i = size - 1; i >= 0; --i)
for (auto j = 0; j < i; ++j)
if (pp[j] > pp[j + 1])
swap(pp[j], pp[j + 1]);
}
void fill(Point* pp, const size_t size) {
for (auto i = 0u; i < size; ++i) cin >> pp[i];
}
void show(Point* pp, const size_t size) {
for (auto i = 0u; i < size; ++i) cout << i + 1 << ": " << pp[i] << '\n';
}
int main() {
cout << "Size: ";
size_t size;
cin >> size;
const auto points = new Point[size];
fill(points, size);
system("cls");
cout << "Before:\n";
show(points, size);
bubble(points, size);
cout << "After:\n";
show(points, size);
delete[] points;
system("pause");
}
Алексей Шалумов
Алексей Шалумов
76 347
Лучший ответ
Михаил Ильин out << '[' << p.x_ << ", " << p.y_ << ']'; // может все таки cout ?
Михаил Ильин Point(const int x, const int y) : x_(x), y_(y) {}

А зачем const? Инициализация не прокатит?
#include <iostream>
#include <time.h>

using namespace std;

class P
{
public:
P() // Конструктор по умолчанию, нужен для создания массива объектов
{
x = 0;
y = 0;
}

P(int x, int y) // Конструктор для инициализации переменных
{
this->x = x;
this->y = y;
}
// Так называемые гетеры и сетеры для установки и получения значения переменных
int GetX()
{
return x;
}

void SetX(int x)
{
this->x = x;
}

int GetY()
{
return y;
}

void SetY(int x)
{
this->y = y;
}

void print()
{
cout << "x = " << x << " y = " << y << endl;
}

private:
int x;
int y;
};

int main()
{
srand(time(0));

int size;
cin >> size;

P *arr = new P[size];

int x, y;

for (int i = 0; i < size; i++)
{
// cin >> x;
// cin >> y;
x = rand();
y = rand();
arr[i] = P(x, y);
}

P temp; // временный объект для обмена элементов местами

// Сортировка массива пузырьком
for (int i = 0; i < size - 1; i++)
{
for (int j = 0; j < size - i - 1; j++)
{
if (arr[j].GetX() > arr[j + 1].GetX())
{
// меняем элементы местами
temp.SetX(arr[j].GetX());
arr[j].SetX(arr[j + 1].GetX());
arr[j + 1].SetX(temp.GetX());
}
}
}

// Вывод отсортированного массива на экран
for (int i = 0; i < size; i++)
{
arr[i].print();
}

delete [] arr;

system("pause");

}
ИМ
Илья Митюхин
15 398
Илья Митюхин Если хотите сами ручками вводить значения то уберите x = rand(); y = rand(); и раскоментируйте строки cin >> x; cin >> y; и srand(time(0)); тоже можно убрать как и time.h
Илья Митюхин Ошибки те что были исправлены:

1. Если вы создаете массив объектов то, либо должен быть конструктор по умолчанию (когда ему ничего не передается), либо использовать непонятную штуку называемую placement new! (читаем в интернете про placement new) Почему же так!? Как только вы выделяете память для объектов то сразу автоматически вызывается конструктор. А у вас конструктор должен принимать значения x и y. Откуда ему взять эти значения?

2. Если вы создали переменные x и y приватными (private) то как вы тогда пытаетесь к ним обратиться? Либо делаем переменные public и работаем с ними напрямую либо делаем private и пишем функции для установки и считывания переменных, так называемые гетеры и сетеры (от англ. get и set).
Илья Митюхин Кстати конструктор по умолчанию мог выглядеть и так:

P() : x(0), y(0)
{
}

решил не путать начинающего такими записями.
Илья Митюхин И забыл еще одно. Точка с запятой после фигурной скобки ставится только после класса или структуры. В остальных случаях она не нужна.