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

this возвращает неправильное значение - C++

Восстановить пароль Регистрация
 
AnreyKazakov
Заблокирован
01.10.2012, 14:57     this возвращает неправильное значение #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <string>
using namespace std;
class oops{
    public:
    oops():key(10){}
    int key;
    oops& oper1(int &roll){
        roll*=key;
        return *this;
        }
    int oper2(int roll2){
        roll2+=10;
        return roll2;
        }
    };
    int main(){
        class oops cls1;
        cout<<"enter value: ";
        int k=0;cin>>k;
        cout<<(cls1.oper1(k).oper2(k))<<endl;
        return 0;   
        }
Разбираюсь с this... Пока не очень выходит... Есть кусок кода сверху, но он работает не так как надо. По задумке когда вводишь к=12, на экране должно появляться 130, а выходит 22, такое чувство, что первую функцию как-будто пропускает (oper1)....
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
KATbIK
 Аватар для KATbIK
86 / 81 / 10
Регистрация: 02.08.2011
Сообщений: 335
01.10.2012, 15:04     this возвращает неправильное значение #2
не знаю у меня твой код 130 выводит.
AnreyKazakov
Заблокирован
01.10.2012, 15:11  [ТС]     this возвращает неправильное значение #3
Цитата Сообщение от KATbIK Посмотреть сообщение
не знаю у меня твой код 130 выводит.
Как так, а какой компилятор? среда?
У меня Джини, MinGW компилятор.... Вот не хочет и все =(((
KATbIK
 Аватар для KATbIK
86 / 81 / 10
Регистрация: 02.08.2011
Сообщений: 335
01.10.2012, 15:28     this возвращает неправильное значение #4
IDE devcpp, компиль mingw v4
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
01.10.2012, 15:35     this возвращает неправильное значение #5
Да, у меня тоже 22 выводит при вводе 12 (компилятор от VS2012). Но вот в следующем коде - 130:
C++
1
2
3
4
5
6
7
8
9
10
11
int main()
{
    class oops cls1;
    cout<<"enter value: ";
    int k=0;cin>>k;
    cls1.oper1(k);
    cout<<cls1.oper2(k)<<endl;
    //cout<<(cls1.oper1(k).oper2(k))<<endl;
    system("pause");
    return 0;
}
AnreyKazakov
Заблокирован
01.10.2012, 16:17  [ТС]     this возвращает неправильное значение #6
Цитата Сообщение от yuron_477 Посмотреть сообщение
(cls1.oper1(k).oper2(k))
Блин, в учебнике не такой конечно пример, но очень похожий, там oper1 меняет координаты курсора, а oper2 его туда перемещает, можно конечно так сделать, но это не красиво =( код раздует потом, когда переменных много будет... я думаю...
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
#include <iostream>
using namespace std;
class oops{
    public:
    oops():key(10),roll2(0){}
    int key;
    int roll2;
    oops& oper1(int &roll){
        roll*=key;
        roll2=roll;
        return *this;
        }
    int oper2(){
        roll2+=10;
        return roll2;
        }
    };
    int main(){
        class oops cls1;
        cout<<"enter value: ";
        int k=0;cin>>k;
        cout<<(cls1.oper1(k).oper2())<<endl;
        return 0;   
        }
Может есть более легкое избавление от такое проблемы?

Добавлено через 5 минут
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
cout<<(cls1.oper1(k).oper2())<<endl;
PS Нужно чтобы именно в таком виде вызов был
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
01.10.2012, 16:46     this возвращает неправильное значение #7
Можно попробовать в oper2 передавать аргумент тоже по ссылке:
C++
1
2
3
4
int & oper2(int &roll2){
    roll2+=10;
    return roll2;
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.10.2012, 16:47     this возвращает неправильное значение #8
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
Нужно чтобы именно в таком виде вызов был
AnreyKazakov, такие конструкции нежелательны. Тут, если я правильно понял, проблема связана с, так называемыми, точками следования. Можно здесь почитать. http://alenacpp.blogspot.com/2005/11...ce-points.html
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
01.10.2012, 16:52     this возвращает неправильное значение #9
возможно это связанно с оптимизациями или с неопределенным порядком вычисления аргументов для функций. в стандарте о порядке вроде бы ничего не говорится.
если поразмышлять, почему получается 22, то в голову приходит мысль о том, что перед вызовом oper1 вычислился аргумент для oper2 (к = 12) и запомнился где-то. далее идет вызов oper1 и потом oper2, но вот в oper2 передается не то, что в этой переменной, а то, что было вычисленно заранее. т.е. 12. и получается, что функция возвращает 22.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.10.2012, 17:07     this возвращает неправильное значение #10
Это оно и есть: undefined behavior.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.10.2012, 17:09     this возвращает неправильное значение
Еще ссылки по теме:

C++ Неправильное значение итератора end()
Неправильное возвращаемое значение функции time C++
Неправильное значение объема конуса C++

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

Или воспользуйтесь поиском по форуму:
AnreyKazakov
Заблокирован
01.10.2012, 17:09  [ТС]     this возвращает неправильное значение #11
Цитата Сообщение от alsav22 Посмотреть сообщение
Можно здесь почитать. http://alenacpp.blogspot.com/2005/11...ce-points.html
Такая статья классная, особенно пример понравился:
C++
1
2
3
4
5
int x;
x = 3;
cout << (++ x + ++ x) + ++ x << endl;
x = 3;
cout << ++ x + (++ x + ++ x) << endl;
gcc 3.4.4:
16
18
Получилось, что операция сложения не ассоциативна!

Ахахах, как такое можно было придумать
Yandex
Объявления
01.10.2012, 17:09     this возвращает неправильное значение
Ответ Создать тему
Опции темы

Текущее время: 00:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru