Невозможно преобразовать "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 никто не освобождает, сравнение вещественных чисел на равенство.

→ Ссылка