Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
0 / 1 / 2
Регистрация: 25.07.2015
Сообщений: 18
1

Не выполняется перегруженный оператор присваивания

25.07.2015, 05:52. Просмотров 341. Ответов 4
Метки нет (Все метки)

Подскажите пожалуйста, почему ругается компилятор? Я только начал изучать С++ по книге Шилдта, и там написана вот эта программа. В 93 строке выскакивает ошибка мол то что перегруженному оператору= нужны два объекта тип sample, но ведь как я понимаю функция input() возвращает как раз таки объект sample, или я что-то упустил? в книге эта программа выполняется.
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <iostream>
#include <cstring>
#include <cstdlib>
 
using namespace std;
 
class sample {
    char *s;
 
public:
    sample ();
 
    sample(const sample &ob); //Конструктор копии
 
    ~sample() {
        if(s) delete [] s;
 
        cout<< "Oswobojdenie s-pamiati \n";
    }
 
    void show() {
        cout << s<< "\n";}
 
    void set(char *str);
 
    sample operator=(sample &ob);
 
};
 
//Обычный конструктор
 
sample:: sample()
{
    s =new char('\0'); //Член S указывет на нуль строку
}
 
// Конструктор копии
 
sample::sample (const sample &ob)
 
{
    s = new char[strlen(ob.s) +1];
    strcpy (s, ob.s);
 
}
 
//Загрузка строки
 
void sample::set(char *str)
{
    s = new char[strlen(str) +1];
 
    strcpy(s, str);
}
 
//Перегрузка оператора присваивания
 
sample sample::operator=(sample &ob)
{
   /*Если выделенная область памяти имеет недостаточный размер,
выделяется новая область памяти.*/
    if (strlen(ob.s)> strlen(s)) {
        delete [] s;
        s=new char[strlen(ob.s)+1];
    }
    strcpy(s, ob.s);
    return *this;
}
 
//Эта функция возвращает объект типа sample
 
sample input()
{
    char instr[80];
 
    sample str;
 
    cout<< "Wwedite stroku: ";
 
    cin >> instr;
 
    str.set(instr);
 
    return str;
}
 
int main()
{
    sample ob;
 
    //Присваиваем объект, возвращаемый функцией input(), объекту ob.
 
    ob = input();
 
    ob.show();
 
    return 0;
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.07.2015, 05:52
Ответы с готовыми решениями:

Перегруженный оператор присваивания
Достаточно информации прочитал, что такое перегруж. оператор присваивания, но не до конца понимаю...

Перегруженный оператор присваивания
Добрый вечер! Встретил пример в книге, где есть перегруженный оператор присваивания. В итоге код...

Не работает перегруженный оператор присваивания
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;Windows.h&gt; class OutOfBoundsException {}; class...

Очередь, конструктор копирования и перегруженный оператор присваивания
#include &lt;iostream&gt; using namespace std; typedef char type; struct Node { type element;...

4
Игогошка!
1798 / 705 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
25.07.2015, 06:02 2
Оператор присваивания класса sample должен принимать не просто ссылку, а константную ссылку.
0
Грамотный. Безпорно.
16793 / 9692 / 1869
Регистрация: 27.09.2012
Сообщений: 24,053
Записей в блоге: 2
25.07.2015, 06:55 3
Цитата Сообщение от ct0r Посмотреть сообщение
Оператор присваивания класса sample должен принимать не просто ссылку, а константную ссылку.
ну и возвращать, желательно, тоже ссылку, а не копию

Добавлено через 5 минут
в деструкторе
C++
1
delete [] s;//освобождаете всегда так, как будто выделяли с помощью new[].
хотя в конструкторе
C++
1
s =new char('\0');//выделяете место под один символ с помощью new (non-array)
Это неправильно. Если для выделения использовали new, то освобождайте с помощью delete. Если выделяли с помощью new[], то освобождайте с помощью delete[].

C++
1
2
3
4
5
void sample::set(char *str)
{
    s = new char[strlen(str) +1];//А старую память кто будет освобождать?
//...
}
0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
25.07.2015, 14:35 4
Цитата Сообщение от EdWooD Посмотреть сообщение
C++
1
if(s) delete [] s;
if не нужен.
If this is a null-pointer, the function does nothing.
0
Эксперт С++
8325 / 6077 / 604
Регистрация: 10.12.2010
Сообщений: 28,212
Записей в блоге: 27
25.07.2015, 15:41 5
Цитата Сообщение от ct0r Посмотреть сообщение
Оператор присваивания класса sample должен принимать не просто ссылку, а константную ссылку.
Ну либо по значению.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.07.2015, 15:41

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Нужно ли реализовать также отдельно конструктор копирования, если имеется перегруженный оператор присваивания?
у меня есть класс. и прототип перегруженной операции присваивания some_class&amp;...

Для шаблонного класса перегрузить оператор присваивания, copy-конструктор, объекты cin и cout, оператор *
Помогите в следующем: Для класса шаблона следует перегрузить оператор присваивания, конструктор...

Перегруженный оператор +
Здравствуйте. Нужно разобраться как работает перегруз операторов. Я взял оператор + и пытаюсь...

перегруженный оператор <<
подскажите как перегрузить оператор &lt;&lt; для класса как описать само перегружение friend ostream&amp;...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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