Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.06.2012, 21:43   #1
Qwoort
Пользователь
 
Аватар для Qwoort
 
Регистрация: 26.04.2009
Сообщений: 13
По умолчанию Ошибка с конструктором копирования

В функции main() в строках "a=b++;" и "a=b++;" компилятор выдает ошибку:

No matching function for call to `SimpleCircle::SimpleCircle(SimpleC ircle)'
candidates are: SimpleCircle::SimpleCircle(SimpleCi rcle&)
SimpleCircle::SimpleCircle(int).



Код:
#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();    
}
Но когда я удаляю из кода конструктор копирования, всё начинает работать и выдает правильный результат. В чем может быть проблема?
Смех без причины - признак Даламбера.
Qwoort вне форума Ответить с цитированием
Старый 13.06.2012, 01:09   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

попробуй переписать конструктор вот так:
SimpleCircle(const SimpleCircle & rhs) // <= Конструктор копирования
_Bers вне форума Ответить с цитированием
Старый 13.06.2012, 02:50   #3
Лета
Пользователь
 
Регистрация: 10.06.2012
Сообщений: 44
По умолчанию

Я только что запустила ваш код у себя (VS 2008), и все корректно заработало.
Да и конструктор копирования вполне адекватный. Действительно, там в передаваемом в конструктор параметре ставят const, но конкретно в данном случае это не играет роли... хотя, кто знает, может для вашего компилятора это имеет какое-то важное значение..
Лета вне форума Ответить с цитированием
Старый 13.06.2012, 11:52   #4
Qwoort
Пользователь
 
Аватар для Qwoort
 
Регистрация: 26.04.2009
Сообщений: 13
По умолчанию

Переделывал так:
Код:
SimpleCircle :: SimpleCircle(const SimpleCircle & rhs)
{int val=rhs.GetRadius(); itsRadius=new int(rhs.GetRadius());}
и так:

Код:
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.
Смех без причины - признак Даламбера.
Qwoort вне форума Ответить с цитированием
Старый 13.06.2012, 11:54   #5
Qwoort
Пользователь
 
Аватар для Qwoort
 
Регистрация: 26.04.2009
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Лета Посмотреть сообщение
Я только что запустила ваш код у себя (VS 2008), и все корректно заработало.
Да и конструктор копирования вполне адекватный. Действительно, там в передаваемом в конструктор параметре ставят const, но конкретно в данном случае это не играет роли... хотя, кто знает, может для вашего компилятора это имеет какое-то важное значение..
Вот я и думаю имеет ли смысл переходить на VS (сейчас работаю в DevCpp)?
Смех без причины - признак Даламбера.
Qwoort вне форума Ответить с цитированием
Старый 13.06.2012, 15:12   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Очень хорошо. Копирующий конструктор мы тебе уже вылечили. Теперь будем лечить геттер. Перепиши его вот так:

int SimpleCircle :: GetRadius() const
{return *itsRadius;}
_Bers вне форума Ответить с цитированием
Старый 13.06.2012, 16:16   #7
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Цитата:
но конкретно в данном случае это не играет роли...
Имеет, временные объекты умеют передаваться только по константной ссылке.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 13.06.2012, 16:26   #8
Лета
Пользователь
 
Регистрация: 10.06.2012
Сообщений: 44
По умолчанию

Цитата:
Сообщение от Granus Посмотреть сообщение
Имеет, временные объекты умеют передаваться только по константной ссылке.
Там ставили const для того, чтобы быть уверенным, что передаваемый по ссылке объект не изменится в процессе работы конструктора копирования. Не так разве?

Последний раз редактировалось Лета; 13.06.2012 в 18:19.
Лета вне форума Ответить с цитированием
Старый 13.06.2012, 17:59   #9
Qwoort
Пользователь
 
Аватар для Qwoort
 
Регистрация: 26.04.2009
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Granus Посмотреть сообщение
Имеет, временные объекты умеют передаваться только по константной ссылке.
Спасибо, разобрался.
Смех без причины - признак Даламбера.
Qwoort вне форума Ответить с цитированием
Старый 13.06.2012, 18:27   #10
Лета
Пользователь
 
Регистрация: 10.06.2012
Сообщений: 44
По умолчанию

Объясните теперь мне, пожалуйста, значение этого const в конструкторе копирования. Потому что я все время думала, что он(const) там играет просто "перестраховочную" роль.

Вы имели ввиду, что при создании копии объекта, который передается по значению в метод, конструктор копирования вызывается, и базовый объект может в него передаться только по константной ссылке?
Лета вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с конструктором Merovingian Общие вопросы C/C++ 8 28.09.2011 14:55
Проблема с конструктором igor17 Общие вопросы C/C++ 13 15.05.2011 22:23
Макрос для копирования значений из нескольких файлов в один общий с определенным условием копирования zenner Microsoft Office Excel 0 21.03.2011 14:48
Что-то не так с конструктором Дырдин Общие вопросы C/C++ 7 26.03.2010 18:33
Помогите с конструктором girkoff Общие вопросы C/C++ 10 01.11.2009 16:01