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

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

Восстановить пароль Регистрация
 
Qwoort
 Аватар для Qwoort
0 / 0 / 0
Регистрация: 04.06.2009
Сообщений: 49
12.06.2012, 21:43     Ошибка с конструктором копирования #1
В коде в строках 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();    
}
Но когда я удаляю из кода конструктор копирования, всё начинает работать и выдает правильный результат. В чем может быть проблема?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
12.06.2012, 22:15     Ошибка с конструктором копирования #2
Цитата Сообщение от Qwoort Посмотреть сообщение
SimpleCircle(SimpleCircle & rhs);// <= Конструктор копирования
Нужна ссылка на контанту:
C++
1
SimpleCircle(SimpleCircle const& rhs);
И ещё, в конструкторах выделяется память, и дальше нигде не освобождается, надо бы добавить это в деструктор.

Добавлено через 4 минуты
Цитата Сообщение от Qwoort Посмотреть сообщение
Но когда я удаляю из кода конструктор копирования, всё начинает работать и выдает правильный результат.
Потому что компилятор сам его сгенерирует, и там будет копирование itsRadius.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4925 / 2668 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
13.06.2012, 03:48     Ошибка с конструктором копирования #3
А еще оператор присвоения нужно описать.
Qwoort
 Аватар для 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
13.06.2012, 13:13     Ошибка с конструктором копирования #5
Qwoort, Возьмите за правило, если в классе идет работа с памятью (явное выделение/очистка) - надо определять деструктор, конструктор копирования, оператор присваивания.
C++
1
int GetRadius();
Почему функция не константная? Надо
C++
1
int GetRadius() const;
Qwoort
 Аватар для 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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++ Проблеммка с конструктором копирования
C++ шаблон с конструктором копирования
C++ Непонятки с конструктором копирования

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

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

Текущее время: 02:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru