Russian Qt Forum
Ноябрь 24, 2024, 20:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Переменная класса - не могу понять почему не сохраняется?  (Прочитано 6086 раз)
UVD
Гость
« : Июнь 18, 2016, 14:31 »

объявляю в классе переменную saldocredit и метод Add

Код:
class Schet {
    double saldocredit = 0;

    void Add (double summ) {
        saldocredit = saldocredit + summ;
}
}

далее есть пременная
Код:
Schet s01;

так вот при каждом обращении к методу s01.Add переменная saldocredit все время имеет нулевое начальное значение

а мне хотелось бы чтобы она помнила свое предыдущее значение

в С недавно поэтому полдня голову ломаю как быть, help!
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Июнь 18, 2016, 15:11 »

Это с++, а не си. В си нет class.

И код работает:

Код
C++ (Qt)
#include <iostream>
 
class Schet {
   public:
       double saldocredit = 0;
 
       void Add (double summ) {
           saldocredit = saldocredit + summ;
       }
};
 
int main(int argc, char *argv[])
{
   Schet s;
   s.Add(2); // 2
   std::cout << s.saldocredit << "\n";
   s.Add(2); // 4
   std::cout << s.saldocredit << "\n";
   s.Add(2); // 6
   std::cout << s.saldocredit << "\n";
 
   return 0;
}
 

И saldocredit = saldocredit + summ; можно заменить на более короткий аналог: saldocredit += summ;
Записан

UVD
Гость
« Ответ #2 : Июнь 18, 2016, 15:51 »

да я в курсе про +=, но уже настолько все достало, чтто заменил явным вызовом

у меня не работает, например если заменить double saldocredit = 0; на double saldocredit = 1; то все время будет равна 1

меттод Add вызывается из других методов класса, может поэтому?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Июнь 18, 2016, 15:54 »

покажи использование переменной Schet s01; — подозреваю, что ты ее постоянно пересоздаешь
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
UVD
Гость
« Ответ #4 : Июнь 18, 2016, 16:27 »

если обращась из  класса ProvodkaRecord, то не сохраняется!
Код:
class ProvodkaRecord {

public:
    bool SetProvodkaRecordSumm(Schet fromschet, Schet toschet, double summa) {

            //отнимаем от счета fromschet
            fromschet.Snyat(summ);
            //прибавляем к счету toschet
            toschet.Vnesti(summ);

            return true;
        }
    }


class Provodki {
private:
    vector<ProvodkaRecord> ProvodkiList;
public:
    bool AddProvodka (Schet fromschet, Schet toschet, double summa) {
        ProvodkaRecord tmp; tmp.SetProvodkaRecordSumm(fromschet, toschet, summa);
        ProvodkiList.push_back(tmp);
        return true;
    }
};



Код:
///и вызов - снятьь с s01 и добавить к s10:
MyProvodkiList.AddProvodka(s01, s10, 1200);


если напрямую к переменной класса Schet, то все ОК

Код:
    s01.Vnesti(5200);

    s01.Snyat(1200);
Записан
Bepec
Гость
« Ответ #5 : Июнь 18, 2016, 17:06 »

У вас копирование происходит. Чтобы изменять в том же объекте, нужно передавать указатель, например Улыбающийся
Записан
UVD
Гость
« Ответ #6 : Июнь 18, 2016, 17:13 »

постепенно я начинаю понимать  Строит глазки

однако как это должно быть написано?   Непонимающий
Записан
UVD
Гость
« Ответ #7 : Июнь 18, 2016, 17:20 »

все! спасибо!!   Веселый

Код:
public:
    bool AddProvodka (Schet* fromschet, Schet* toschet, double summa) {


вызов
Код:
    MyProvodkiList.AddProvodka(&s01, &s10, 1200);
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #8 : Июнь 18, 2016, 20:38 »

вместо указателя можно и по ссылке передавать, тогда будет
Код
C++ (Qt)
bool AddProvodka (Schet& fromschet, Schet* toschet, double summa);
 
MyProvodkiList.AddProvodka(s01, &s10, 1200);
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
UVD
Гость
« Ответ #9 : Июнь 19, 2016, 05:37 »

да, действительно, так понятней - переделал  Улыбающийся

пришлось только заменить fromschet->Snyat(summ); на fromschet.Snyat(summ);

не могу понять когда должно быть -> и когда .

просто делаю, что компилятор говорит  Грустный

з.ы. надо  же, вчера  часов шесть времени и килограмм нервов убил только на то, чтобы понять, что аргументты копирутся, и нужно ссылку передавать
до сих пор страшно вспомнить  Рот на замке
Записан
Vamireh
Гость
« Ответ #10 : Июнь 19, 2016, 11:39 »

-> - когда указатель
. - когда по ссылке или по значению.

Это, если по-дилетантски. А вообще, стрелка - оператор разыменования. Можно писать просто (*var).foo(), а var->foo() - вроде сокращенной записи.
Еще прикольно умные указатели: там и точка, и стрелка...
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #11 : Июнь 19, 2016, 13:41 »

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.168 секунд. Запросов: 23.