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

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

Войти
Регистрация
Восстановить пароль
 
Reiji Cross
26 / 26 / 1
Регистрация: 14.05.2010
Сообщений: 57
#1

Конструктор-копировщик - C++

19.08.2010, 22:08. Просмотров 624. Ответов 6
Метки нет (Все метки)

Доброго времени суток!
Сейчас изучаю класы, и столкнулся с такой проблемой. Компилятор отказывается понимать те функции-члены, в которых я передаю объекты как ссылки. В моем случае это строки где объявляются и описываются конструктор-копировщик и перегруженный оператор присвоения. Вот код.
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
#include "iostream"
 
using namespace std;
 
class SimpleCircle
{
public:
    SimpleCircle(int);
    SimpleCircle();
    SimpleCircle(SimpleCircle &);
    const SimpleCircle & operator++();
    const SimpleCircle operator++(int);
    SimpleCircle & operator=(SimpleCircle&);
    void SetRadius(int x);
    int GetRadius();
private:
    int *itsRadius;
};
 
SimpleCircle::SimpleCircle()
{
    itsRadius = new int(5);
}
 
SimpleCircle::SimpleCircle(int rad)
{
    itsRadius = new int(rad);
}
 
SimpleCircle::SimpleCircle(SimpleCircle & rhs)
{
    int val = rhs.GetRadius();
    itsRadius = new int(val);
}
 
const SimpleCircle & SimpleCircle::operator++()
{
    ++*itsRadius;
    return *this;
}
 
const SimpleCircle SimpleCircle::operator++(int)
{
    SimpleCircle temp(*this);
    ++*itsRadius;
    return temp;
}
 
SimpleCircle & SimpleCircle::operator=(SimpleCircle& sc)
{
    if(this == &sc)
        return *this;
    delete itsRadius;
    int val = sc.GetRadius();
    itsRadius = new int(val);
    return *this;
}
 
int main()
{
    return 0;
}
Ошибка: LNK2019: unresolved external symbol "public: int __thiscall SimpleCircle::GetRadius(void)" (?GetRadius@SimpleCircle@@QAEHXZ) referenced in function "public: __thiscall SimpleCircle::SimpleCircle(class SimpleCircle &)" (??0SimpleCircle@@QAE@AAV0@@Z)

Заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.08.2010, 22:08     Конструктор-копировщик
Посмотрите здесь:

Конструктор копировщик - C++
Самостоятельно изучаю С++ по Либерти(освой за 21 день) Требуется создать класс и конструктор копировщик. Компилятор Visual C++ 2010. ...

Конструктор-копировщик - C++
Matrix::Matrix(const Matrix & rhs) { itsNumOfStr = rhs.itsNumOfStr; itsNumOfCol = rhs.itsNumOfCol; //cout << "CONTRRRRRRRR\n"; ...

Конструктор - копировщик: ошибка - C++
при таком кодеclass cat{ public: cat(); ~cat(); cat(cat&); }; cat::cat(){ cout<<"Cat constructor"<<endl; ...

Виртуальный конструктор копировщик. - C++
Добрый вечер . Объясните для чего в природе может быть использован виртуальный конструктор копировщик ? виртуальная функция существует для...

конструктор копировщик-смысл? - C++
объясните пожалуйста для чего нужен конструктор копировщик... в С++ за 21 день страница 248

Конструктор копировщик объектов, содержащих массивы - C++
Конструктор копировщик который будет создавать объекты в которых есть массивы. Можно просто фрагмент кода.

[C++] В чём тут ошибка? (делаю конструктор-копировщик) - C++
Пытаюсь написать класс с конструктором-копировщиком.В чём тут ошибка? class Subroutine { public: Subroutine (){}; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
19.08.2010, 22:15     Конструктор-копировщик #2
Вообще-то ошибка в функции GetRadius...
Определите ее - ошибка пропадет
Да и setradius определить неплохо было бы
Reiji Cross
26 / 26 / 1
Регистрация: 14.05.2010
Сообщений: 57
19.08.2010, 22:21  [ТС]     Конструктор-копировщик #3
Спасибо большое!

Закопипастил не все прошлое упражнение, и сам не заметил такую глупую ошибку, видимо сегодня надо завязывать с класами
ISergey
Maniac
Эксперт С++
1373 / 884 / 52
Регистрация: 02.01.2009
Сообщений: 2,653
Записей в блоге: 1
19.08.2010, 23:00     Конструктор-копировщик #4
На заметку.. Лучше так делать
C++
1
2
3
SimpleCircle(const SimpleCircle &); //!
//...
SimpleCircle & operator=(const SimpleCircle&); //!
и деструктор добавь.
Crudelis
Шаровик затейник
672 / 414 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
20.08.2010, 15:36     Конструктор-копировщик #5
как то меня смущает правильность выделения динамической памяти:
Цитата Сообщение от Reiji Cross Посмотреть сообщение
itsRadius = new int(5);
Цитата Сообщение от Reiji Cross Посмотреть сообщение
itsRadius = new int(rad);
Цитата Сообщение от Reiji Cross Посмотреть сообщение
itsRadius = new int(val)
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
20.08.2010, 17:08     Конструктор-копировщик #6
Crudelis, не надо смущаться. Память здесь выделяется не под массив, здесь для itsRadius выделяется память размером в один int, причем значение, которое хранится по адресу, выделенному оператором new, инициализируется конструктором. Т.е. запись
C++
1
itsRadius = new int(5);
аналогична записи
C++
1
2
itsRadius = new int;
*itsRadius = 5;
Другое дело, что:
  1. выделение динамической памяти в данном примере не нужно;
  2. автор забыл определить деструктор, который бы эту память удалял.
Reiji Cross, конструктор копирования можно было бы определить так:
C++
1
2
3
4
SimpleCircle::SimpleCircle(const SimpleCircle & rhs) // Ну и передаем по КОНСТАНТНОЙ ссылке
{
        itsRadius = new int(rhs.itsRadius);
}
PS. Семантика операторов инкремента здесь совсем не очевидна, и ИМХО лучше бы обойтись здесь без них (а в замен определить какие-нибудь более полезные методы, к примеру, вычисление площади и длины окружности)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.08.2010, 20:25     Конструктор-копировщик
Еще ссылки по теме:

Стандартный конструктор копировщик и оператор = не справляются со своей задачей - C++
Всем привет ! Выяснил , что стандартный конструктор копировщик и оператор = не справляются со своей задачей в случае, если...

Параметр rhs, что это и для чего (конструктор-копировщик) - C++
Вот код: #include <iostream> class jurnal { public: jurnal() { }

Конструктор - C++
Вот если в конструкторе инициализировать какую-то переменную (к=0), можно же ее в каком-то методе изменять (например к++)?

Конструктор new - C++
#include "stdafx.h" #include <string> #include <iostream> using namespace std; class IoString{ public: string str; ...

this и конструктор - C++
Всем привет! Столкнулся с задачей: У класса есть статический указатель, который инициализируется CableTV* CableTV :: ptr = new...


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

Или воспользуйтесь поиском по форуму:
Crudelis
Шаровик затейник
672 / 414 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
20.08.2010, 20:25     Конструктор-копировщик #7
Nameless One, ага, спасибо за разъяснения, я этого не знал
Yandex
Объявления
20.08.2010, 20:25     Конструктор-копировщик
Ответ Создать тему
Опции темы

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