Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Qwoort
0 / 0 / 0
Регистрация: 04.06.2009
Сообщений: 49
#1

Ошибка с конструктором копирования - C++

12.06.2012, 21:43. Просмотров 666. Ответов 7
Метки нет (Все метки)

В коде в строках 59 и 60 компилятор выдает ошибку:
No matching function for call to `SimpleCircle::SimpleCircle(SimpleCircle)'
candidates are: SimpleCircle::SimpleCircle(SimpleCircle&)
SimpleCircle::SimpleCircle(int).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include<iostream>
#include<conio.h>              
using namespace std;
 
class SimpleCircle           
{
      public:
             SimpleCircle();
             SimpleCircle(int);
             
             SimpleCircle(SimpleCircle & rhs);// <= Конструктор копирования
             
             ~SimpleCircle();
             
             SimpleCircle operator++();
             SimpleCircle operator++(int);
             
             void SetRadius(int);
             int GetRadius();
      private:
              int *itsRadius;
};
 
SimpleCircle :: SimpleCircle()
{itsRadius=new int;*itsRadius=5;}
 
SimpleCircle :: SimpleCircle(int input)
{itsRadius=new int;*itsRadius=input;}
 
SimpleCircle :: SimpleCircle(SimpleCircle & rhs) // <= Конструктор копирования
{int val=rhs.GetRadius(); itsRadius=new int(val);}
 
SimpleCircle :: ~SimpleCircle(){}
 
SimpleCircle SimpleCircle :: operator++()
{
    ++(*itsRadius);
    return *this;
}
 
SimpleCircle SimpleCircle :: operator++(int)
{
    SimpleCircle temp(*this);
    ++(*itsRadius);
    return temp;
}
 
void SimpleCircle :: SetRadius(int input)
{itsRadius=new int;*itsRadius=input;}
int SimpleCircle :: GetRadius()
{return *itsRadius;}
 
 
int main()
{    
    SimpleCircle a(10), b(20);
    ++a;++b;
    a++;b++;
    a=b++;//<= Здесь ошибка
    a=++b;//<= и здесь.
    cout << a.GetRadius() << " " << b.GetRadius() << endl;
    getch();    
}
Но когда я удаляю из кода конструктор копирования, всё начинает работать и выдает правильный результат. В чем может быть проблема?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2012, 21:43     Ошибка с конструктором копирования
Посмотрите здесь:

Присваивание конструктором копирования - C++
Всем форумчанам привет. Я совсем недавно изучаю с++. Помогите плиз понять. К примеру вот такой код: #include &lt;iostream.h&gt; int...

Проблеммка с конструктором копирования - C++
В общем суть: /*Создать класс - одномерный массив целых чисел (вектор). Функции-члены обращаются к отдельному элементу массива, вывода...

Шаблон с конструктором копирования - C++
Найдите периметр и площадь выпуклого многоугольника. Распределение памяти для хранения массивов должно осуществляться динамически(в...

Непонятки с конструктором копирования - C++
class Table { Row* p; size_t size; public: Table(int i = 0) { p = new Row; size = i; }

Скопировать массив конструктором копирования - C++
Можете привести пример как скопировать массив конструктором копирования.

Не получается разобраться с конструктором копирования - C++
Вот начала разбираться с конструктором копирования. но я чёт запуталась с ним. Можете помочь? #ifndef PEOPLE_H #define PEOPLE_H ...

Нюансы работы с конструктором копирования: найти и исправить ошибки в коде - C++
Доброго дня! Разбирал тему &quot;Конструктор копирования&quot;. Сделал самостоятельно наглядную программу, но она по результатам отличается от той,...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
1443 / 1172 / 61
Регистрация: 21.04.2012
Сообщений: 2,449
Завершенные тесты: 3
12.06.2012, 22:15     Ошибка с конструктором копирования #2
Цитата Сообщение от Qwoort Посмотреть сообщение
SimpleCircle(SimpleCircle & rhs);// <= Конструктор копирования
Нужна ссылка на контанту:
C++
1
SimpleCircle(SimpleCircle const& rhs);
И ещё, в конструкторах выделяется память, и дальше нигде не освобождается, надо бы добавить это в деструктор.

Добавлено через 4 минуты
Цитата Сообщение от Qwoort Посмотреть сообщение
Но когда я удаляю из кода конструктор копирования, всё начинает работать и выдает правильный результат.
Потому что компилятор сам его сгенерирует, и там будет копирование itsRadius.
MrGluck
Модератор
Эксперт CЭксперт С++
7162 / 4328 / 632
Регистрация: 29.11.2010
Сообщений: 11,750
13.06.2012, 03:48     Ошибка с конструктором копирования #3
А еще оператор присвоения нужно описать.
Qwoort
0 / 0 / 0
Регистрация: 04.06.2009
Сообщений: 49
13.06.2012, 11:58  [ТС]     Ошибка с конструктором копирования #4
Переделывал так:
C++
1
2
SimpleCircle :: SimpleCircle(const SimpleCircle & rhs)
{int val=rhs.GetRadius(); itsRadius=new int(rhs.GetRadius());}
и так:
C++
1
2
SimpleCircle :: SimpleCircle(SimpleCircle const & rhs)
{int val=rhs.GetRadius(); itsRadius=new int(rhs.GetRadius());}
и все равно не работает, и выдает другую ошибку:
In copy constructor `SimpleCircle::SimpleCircle(const SimpleCircle&)':
passing `const SimpleCircle' as `this' argument of `int SimpleCircle::GetRadius()' discards qualifiers.
Добавлено через 1 минуту
Цитата Сообщение от MrGluck Посмотреть сообщение
А еще оператор присвоения нужно описать.
Для работы этой программы это обязательно?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
13.06.2012, 13:13     Ошибка с конструктором копирования #5
Qwoort, Возьмите за правило, если в классе идет работа с памятью (явное выделение/очистка) - надо определять деструктор, конструктор копирования, оператор присваивания.
C++
1
int GetRadius();
Почему функция не константная? Надо
C++
1
int GetRadius() const;
Qwoort
0 / 0 / 0
Регистрация: 04.06.2009
Сообщений: 49
13.06.2012, 17:57  [ТС]     Ошибка с конструктором копирования #6
Цитата Сообщение от ForEveR Посмотреть сообщение
Qwoort, Почему функция не константная? Надо
C++
1
int GetRadius() const;
Я уже почти разобрался в проблеме, понял, что все дело в const. Тот код я нормально откомпилировал с константами. Только вот чего не пойму:
1) Где в определении таких функций мне ставить const?
То есть какая разница в следующем коде, применимо к моей ситуации?

A)
C++
1
int GetRadius() const;
Б)
C++
1
int const GetRadius();
В)
C++
1
const int GetRadius();
2)Я правильно понимаю, что const выполняет единственную функцию - не дает менять значение или адрес?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
13.06.2012, 19:55     Ошибка с конструктором копирования #7
Qwoort,
C++
1
int GetRadius() const;
Константная функция. Нельзя вызывать не от константного объекта. Не должна менять данные/состояние объекта(исключения типа const_cast и mutable членов не рассматриваем).
В данном случае функция только возвращает радиус, зачем ей быть не константной?
C++
1
int const GetRadius();
И второй вариант написания возвращают интовую константу (т.е. так писать просто бесполезно).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2012, 23:18     Ошибка с конструктором копирования
Еще ссылки по теме:

Конструктор копирования кидает исключение, если копируют объект, созданные дефолтным конструктором - C++
Привет! Вопрос из области философии - наткнулся на такое поведение при работе с IBPP (С++ клиент для работы с Firebird. Firebird - это...

Ошибка инициализации объекта, конструктором класса - C++
Добрый день. Написал программу. Создание класса (упражнение из книги Дейтеля) &quot;Создайте класс с именем Account, которым мог бы...

Ошибка копирования файла - C++
Здравствуйте. Никак не могу скопировать файл. { char * buffer; int len = 10240; ifstream...

Ошибка в конструкторе копирования - C++
Здравствуйте. Есть один класс для работы с многочленами, который хранит элементы многочлена в списке. Так вот, в конструкторе копирования...

Ошибка в перегрузке конструктора копирования - C++
// strimem.cpp // Класс String с экономией памяти // Перегружаемая операция присваивания и конструктор // копирования #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Qwoort
0 / 0 / 0
Регистрация: 04.06.2009
Сообщений: 49
13.06.2012, 23:18  [ТС]     Ошибка с конструктором копирования #8
Спасибо, разобрался.
Yandex
Объявления
13.06.2012, 23:18     Ошибка с конструктором копирования
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru