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

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

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

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

27.11.2011, 19:34. Просмотров 391. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2011, 19:34     не работают перегруженные операторы
Посмотрите здесь:

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

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

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

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

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

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

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

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

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

Не работают логические операторы - C++
Выдает такую ошибку, в интернете не понял как решить, тренируюсь по пособию, там код слово в слово


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

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

и вообще сдвиг << обозначается.
Yandex
Объявления
02.12.2011, 01:24     не работают перегруженные операторы
Ответ Создать тему
Опции темы

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