Невозможно преобразовать "Circle" в "Circle"
#include <iostream>
#include <windows.h>
#include <math.h>
using namespace std;
#define pi 3.14159265359
class Circle
{
private:
//fields
double rad;
double diam;
double length;
double square;
public:
//constructors
Circle()
{
rad = 0.0;
diam = 0.0;
length = 0.0;
square = 0.0;
}
Circle(double rad)
{
this->rad = rad;
diam = rad * 2;
length = 2 * rad * pi;
square = 0.0;
}
Circle(Circle &temp)
{
rad = temp.rad;
diam = temp.diam;
length = temp.length;
square = temp.square;
}
//methods
void count_square(void)
{
square = rad * rad * pi;
}
void show(void)
{
cout << "\n\n\tДанные об окружности:\n\tРадиус - " << rad << ";\n\tДиаметр - " << diam << ";\n\tДлинна окружности - " << length << ";\n\tПлощать окружности - " << square << ".\n\t";
}
Circle double_square_cricle(void)
{
double new_rad = sqrt(2 * square / pi);
Circle temp = Circle(new_rad);
temp.count_square();
return temp;
}
int sravnenie(Circle temp)
{
if (square == temp.get_square())
{
return 0;
}
if (square > temp.get_square())
{
return 1;
}
return 2;
}
double get_square(void)
{
return square;
}
};
void test_func(Circle **arr);
void main(void)
{
SetConsoleOutputCP(1251);
SetConsoleCP(1251);
Circle *arr;
test_func(&arr);
}
void sravnenie_func(Circle first, Circle second)
{
if (first.sravnenie(second) == 0)
{
cout << "\n\tПлощади окружностей равны - " << first.get_square() << ".\n\t";
}
else
{
if (first.sravnenie(second) == 1)
{
cout << "\n\tПлощадь первой окружности больше (" << first.get_square() << " и " << second.get_square() << ").\n\t";
}
else
{
cout << "\n\tПлощать второй окружности больше (" << first.get_square() << " и " << second.get_square() << ").\n\t";
}
}
}
void test_func(Circle **arr)
{
(*arr) = new Circle[3];
(*arr)[0] = Circle();
(*arr)[1] = Circle(1);
(*arr)[1].count_square();
(*arr)[0].show();
(*arr)[1].show();
(*arr)[2] = Circle((*arr)[1].double_square_cricle());
(*arr)[2].show();
cout << "\n\tarr[1] и arr[2]:\n\t";
sravnenie_func((*arr)[1], (*arr)[2]);
cout << "\n\tarr[1] и arr[0]:\n\t";
sravnenie_func((*arr)[1], (*arr)[0]);
cout << "\n\tarr[2] и arr[2]:\n\t";
sravnenie_func((*arr)[2], (*arr)[2]);
}
Ответы (1 шт):
Автор решения: KoVadim
→ Ссылка
Когда Вы пишите строку
Circle temp = Circle(new_rad);
то компилятор хочет вызвать конструктор копирования, но он у Вас немного неожиданно объявлен
Circle(Circle &temp)
Добавьте просто const и все будет работать. Почему не работает так? да просто Circle(new_rad) в предыдущей строке это rvalue, а оно никак не подходит для обычной ссылки
И помните о правиле 3/5 и объявляйте парные операторы присваивания.
Но в Вашем случае я бы просто удалил конструктор копирования - все будет хорошо работать - конструкторы по умолчанию будут нормальны
P.S. В коде есть куча других проблем - утечка памяти - массив arr никто не освобождает, сравнение вещественных чисел на равенство.
