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

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

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

Не работают перегруженные операторы - C++

27.11.2011, 19:34. Просмотров 404. Ответов 5
Метки нет (Все метки)

проблема такова:
есть перегруженный оператор "=", при вызове которого выполняется присвоение значений массива, однако же, результат почему-то обратно в main не возвращается.
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include "stdafx.h"
#include "iostream"
#include "string"
#include "cstring"
 
using namespace std;
using namespace System;
 
enum sost{s0,s1,sX};    //перечисление - значение сигнала
 
struct signal   //структура сигнал
{
    sost s;     //состояние сигнала
    int d;      //длительность состояния
};
 
const int maxx=10;      
const int maxsost=1;    //максимальная длительность состояния сигнала
 
class diagram
{
    friend std::ostream& operator<<(std::ostream& os, diagram& dd);
    signal mas[maxx];
public:
    diagram()   //конструктор по умолчанию
    {
        for (int i=0;i<maxx;i++) 
        {           
            mas[i].d=0;
        };
    };
 
    diagram(sost ss)    //конструктор, инициализирующий временную диаграмму
    {                   //постоянным уровнем сигнала на максимальную длительность
        for (int i=0;i<maxx;i++) 
        {
            mas[i].s=ss;
            mas[i].d=maxsost;
        };
    };
 
    diagram(string ss)  //конструктор, инициализирующий временную диаграмму
    {                   //сигналом, представленным строкой символов
        int j=0;
        int k=0;
        sost st, st1;
        for (int i=0;i<maxx;i++)
        {
            mas[i].d=0;
        };
        if (ss[0]==48) {st=s0;}
        else
            if (ss[0]==49) {st=s1;}
            else {st=sX;}
        for (int i=0;i<ss.length();i++)
        {
            mas[k].s=st;
            if (ss[i]==48) {st1=s0;}
            else
                if (ss[i]==49) {st1=s1;}
                else {st1=sX;}
            if (st1==st) {j++;}
            else 
            {
                if (ss[i]==48) {st=s0;}
                else
                    if (ss[i]==49) {st=s1;}
                    else {st=sX;}
                mas[k].d=j;
                k++;
                j=1;
            };
        };
        mas[k].d=j;
        mas[k].s=st;
    };
 
    diagram(diagram& copy)  //конструктор копирования
    {
        for (int i=0;i<maxx;i++)
        {
            mas[i].d=copy.mas[i].d;
            mas[i].s=copy.mas[i].s;
        };
    };
 
 
     diagram &operator=(diagram &dd)        //переопределение экземпляра класса 
    {                                   //оператор присваивания
        diagram a;
        for (int i=0;i<maxx;i++)
        {
            a.mas[i].d=dd.mas[i].d;
            a.mas[i].s=dd.mas[i].s;
        };
        return a;
    };
 
};
std::ostream& operator<<(std::ostream& os, diagram& dd) //вывод
{
    for (int i=0;i<maxx;i++)
    {
        for (int j=0;j<dd.mas[i].d;j++)
        {
            if (dd.mas[i].s==s0) {os<<"0";}
            else
                if (dd.mas[i].s==s1) {os<<"1";}
                else {os<<"X";};
        };
    };
    return os;
}
int main()
{
    diagram diag1("0011XXXX00");
    diagram diag2("0011");
    diagram d=diag1;
           d=diag2;
    std::cout<<d;
    Console::ReadLine();
    return 0;
}
т.е. d=diag2 не изменяет значение d, а остаётся равным diag1
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2011, 19:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не работают перегруженные операторы (C++):

Указатели и перегруженные операторы - C++
Когда перегружается какой нибудь оператор, допустим квадратные скобки, то для использования оператора нужно писать такую конструкцию: ...

Перегруженные функции и операторы - C++
вопрос может быть тривиальный, но все же: как влияет количество вариантов перегруженных функций и операторов на скорости обработки? то...

Перегруженные операторы - ошибка в коде - C++
Здравствуйте. Подскажите, пожалуйста, в чем ошибка. Нужно описать класс динамического массива и перегрузить операторы. С перегрузкой...

Перегруженные логические операторы И, ИЛИ - C++
Учу по Шилдту плюсы. Дошел до перегрузки операторов. С некоторыми понятно, но вот некоторые вызывают проблемы. Напишите, пожалуйста,...

Перегруженные потоковые операторы при наследовании - C++
В базовом классе есть перегружены операторы взять из потока и вывести в поток, в производном классе они также перегружены. Как мне вызвать...

Классы. Перегруженные операторы ввода-вывода - C++
Есть класс book, который описывает 3 типа данных, то есть автор - char, название книги - char, год - int. Нужно использовать...

5
OstapBender
583 / 522 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
27.11.2011, 20:11 #2
ты в своем операторе= сам объект не изменил ты создал какой-то временный объект 'a' и его выбросил в никуда. this трогай.
1
maxis1523
1 / 1 / 0
Регистрация: 28.10.2009
Сообщений: 20
27.11.2011, 21:15  [ТС] #3
пожалуйста, поподробнее. пробовал всячески и с this, прямо как в учебнике, но ничего не выходит
0
Dekio
Фрилансер
Эксперт С++
5837 / 1218 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
27.11.2011, 21:30 #4
Цитата Сообщение от maxis1523 Посмотреть сообщение
}; };
Что это за прикол такой везде ; ставить?
0
maxis1523
1 / 1 / 0
Регистрация: 28.10.2009
Сообщений: 20
02.12.2011, 01:17  [ТС] #5
в общем убрал объект "а", подставил *this, заработало.
однако ж, не понимаю как тогда реализовать такой перегруженный оператор без дополнительных объектов:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    diagram operator<=(int ii)      //сдвиг временной диаграммы на время ii влево 
    {
        diagram dd;
        int i=0;
        int k=0;
        while (i<ii)
        {
            i+=mas[k].d;
            k++;
        };      
        dd.mas[0].d=i-ii;
        dd.mas[0].s=mas[k-1].s;
        for (i=k;i<maxx;i++)
        {
            dd.mas[i-k].s=mas[i].s;
            dd.mas[i-k].d=mas[i].d;
        };
        return dd;
    }
как его заставить вернуть dd?
0
OstapBender
583 / 522 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
02.12.2011, 01:24 #6
maxis1523, а че мешает и тут изменить this ?
чтоб работал ваш оператор нужно писать че-то типа:
d1 = d1<=2;

и вообще сдвиг << обозначается.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2011, 01:24
Привет! Вот еще темы с ответами:

Класс вектор с арифметическими операциями, перегруженные операторы - C++
Добрый день! Нужна помощь. Реализовываю класс вектор с арифметическими операторами с помощью контейнера &lt;vector&gt;. У меня имеются рабочие...

Наследование, перегруженные операторы ввода-вывода, динамический массив - C++
Суть задания - создать базовый класс - worker, в котором будут поля - имя, фамилия, отчество. В нём же организовать перегрузку операторов...

Какие методы и перегруженные операторы поддерживает std::set? - C++
Предназначение шаблонного класса.Какие методы и перегруженные операторы он поддерживает? Пример кода

Почему перегруженные операторы ввода/вывода нельзя сделать членами класса? - C++
Добрый вечер, Решаю домашнее задание, и вот вопрос возник. Создал класс и перегрузил ввода/вывод. Но не нашел информации почему...


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

Или воспользуйтесь поиском по форуму:
6
Yandex
Объявления
02.12.2011, 01:24
Ответ Создать тему
Опции темы

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