Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 21.09.2013
Сообщений: 13

Ссылки, указатели

27.11.2015, 18:09. Показов 861. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени. Как, используя ссылки, указатели и, возможно, другие приемы сделать что-то вроде этого?:
C++ (Qt)
1
2
3
4
5
int a = 1;
int b = 2;
int x = a + b; // x = 3;
 
b = 5;         // здесь x должен уже равняться 6 без повторного присвоения ( x = a + b)
Как реализовать такое на практике?
Повторюсь, что я хочу добиться изменения в значении x, если соответствующие значения, которые входят в x (в данном случае - a и b), постоянно изменяются. Таких значений, от которых зависит x может быть сколь угодно много, поэтому для меня важно за каждым изменением хотя бы одного из значений не пересчитывать заново x. Конечно, если такое вообще возможно. Буду рад за идеи.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.11.2015, 18:09
Ответы с готовыми решениями:

Указатели и ссылки c++
Здравствуйте! Не могли бы вы объяснить как можно использовать ссылки и указатели c++ на практике? Я не пойму для чего они нужны!

Ссылки и указатели
Добрый день. Возможно было. В чем существенная разница между передачей данных в функцию по ссылке или указателю. В каких случаях вы бы...

Указатели и ссылки?
Ниже приведёна программы которая вызывает функцию. В функции происходит следующее создаются 2 массива в которые записыватся чётные и...

15
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
27.11.2015, 18:16
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
#include <iostream>
using namespace std;
 
 
 
class Foo
{
public:
    void                setA(const int a)
    {
        m_a = a;
        updateX();
    }
    void                setB(const int b)
    {
        m_b = b;
        updateX();
    }
    int                 getX() const
    {
        return m_x;
    }
 
private:
    int                 m_a;
    int                 m_b;
    int                 m_x;
 
    void                updateX()
    {
        m_x = m_a + m_b;
    }
};
int main()
{
    Foo obj;
 
    obj.setA(1);
    obj.setB(2);
    cout << obj.getX() << endl;
    obj.setB(5);
    cout << obj.getX() << endl;
}
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
27.11.2015, 18:18
напрямую программирование такого не поддерживает.
с переменными так точно.
Используй функции, функторы и биндинг их к ссылкам.

Добавлено через 1 минуту
rikimaru2013, много кода из ничего. Не легче?
C++
1
2
3
4
 int                 getX() const
    {
        return m_x= m_a + m_b;
    }
0
99 / 46 / 18
Регистрация: 09.08.2015
Сообщений: 367
27.11.2015, 18:21
Цитата Сообщение от tesco Посмотреть сообщение
для меня важно за каждым изменением хотя бы одного из значений не пересчитывать заново x
Ну тут если только придумать алгоритм и пересчитывать часть, не пересчитывая ничего ничего не измениться.

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
rikimaru2013, много кода из ничего. Не легче?
getX(int*)
Но я думал ТС про оптимизацию.
0
0 / 0 / 0
Регистрация: 21.09.2013
Сообщений: 13
27.11.2015, 18:28  [ТС]
Цитата Сообщение от AncientPenguin Посмотреть сообщение
Но я думал ТС про оптимизацию.
Именно! Потому что нужно high performance и low latency. Подсчитывать x нужно десятки тысяч раз в секунду и при этом сумма равняется не только, как в примере, a + b, таких значений от 10 000 и выше.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
27.11.2015, 18:41
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <functional>
using namespace std;
int main() {
    int a=1;
    int b=2;
    auto c=[&a, &b](){return a+b;};
    std::cout<<" before a="<<a<<", b="<<b<<", c="<<c()<<std::endl;
    a=3, b=4;
    std::cout<<" after a="<<a<<", b="<<b<<", c="<<c()<<std::endl;
    return 0;
}
Оно?
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
27.11.2015, 19:03
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Не легче?
Я не из тех - кто готов гавнокодить ради преуспевания на 1 минуту.
0
0 / 0 / 0
Регистрация: 21.09.2013
Сообщений: 13
27.11.2015, 19:05  [ТС]
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Оно?
Идея именно такая, но здесь, опять же, вызывается c(), чтобы подсчитать a+b. А, если вдруг появляется c, d... или, скажем, a, e, k ... уже не участвуют в подсчете?
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,984
Записей в блоге: 32
27.11.2015, 19:10
tesco, а вы не размениваетесь по мелочам Любая программа - это алгоритм получения условно выходного набора бит по условно входному. А вы тут, вообще говоря, ставите задачу типа "можно ли мне сразу как-то иметь нужный выход при изменении входа, но не производя никаких операций?". В простейшем случае - заранее рассчитанная таблица соответствий. В нетривиальном - все многообразие окружающих нас программ
1
0 / 0 / 0
Регистрация: 21.09.2013
Сообщений: 13
27.11.2015, 19:22  [ТС]
Цитата Сообщение от _Ivana Посмотреть сообщение
tesco, а вы не размениваетесь по мелочам Любая программа - это алгоритм получения условно выходного набора бит по условно входному. А вы тут, вообще говоря, ставите задачу типа "можно ли мне сразу как-то иметь нужный выход при изменении входа, но не производя никаких операций?". В простейшем случае - заранее рассчитанная таблица соответствий. В нетривиальном - все многообразие окружающих нас программ
Предвидя подобного рода пост я в первом сообщении написал:
Конечно, если такое вообще возможно.
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
27.11.2015, 20:31
Ребят, помогите решить простенькую задачку Нахождение корня целого числа методом Ньютона
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.11.2015, 20:40
Цитата Сообщение от tesco Посмотреть сообщение
Предвидя подобного рода пост я в первом сообщении написал
А как такое может быть возможно. Можно бы создать класс который автоапдейтит результат при изменении/добавлении слагаемых.
Но вот что вдохновляет:
Цитата Сообщение от _Ivana Посмотреть сообщение
а вы не размениваетесь по мелочам
А и правда. Что если алгоритм получения результата может непредсказуемо меняться? Почему бы не дать возможность внешнему коду делегировать не только отдельные части но и изменять логику (такие мелочи как ветвления, повторы и пр.). Нужно просто отбросить мелкие рецидивы малодушия, решиться и пойти до конца.
1
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
27.11.2015, 22:14
Ну, если нужно, чтобы при изменении одного слагаемого не пересчитывалась вся сумма, а в ней учитывалось только изменение этого слагаемого, то так:
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
#include <iostream>
#include <vector>
/////////////////////////////////////////////////////////////////////
typedef std::vector < int   >   T_int_vect;
/////////////////////////////////////////////////////////////////////
struct  T_sum
{
    //---------------------------------------------------------------
    T_int_vect  int_vect_;
    int         sum_;
    //---------------------------------------------------------------
public:
    //---------------------------------------------------------------
    T_sum( int size )
        :
        int_vect_   ( size ),
        sum_        ()
    {}
    //---------------------------------------------------------------
    void    set
        (
            int     ind,
            int     val
        )
    {
        int     &   cur_var     =   int_vect_[ ind ];
 
        if  (
                    ind     >=  0
                &&  ind     <   int_vect_.size()
            )
        {
 
            sum_        -=  cur_var;
            sum_        +=  val;
            cur_var     =   val;
        }
    }
    //---------------------------------------------------------------
    void    print()
    {
        std::cout   <<  sum_
                    <<  std::endl;
    }
    //---------------------------------------------------------------
};
/////////////////////////////////////////////////////////////////////
int     main()
{
    T_sum   sum(2);
 
    sum.set(0,1);
    sum.print();
 
    sum.set(1,2);
    sum.print();
 
    sum.set(0,2);
    sum.print();
 
    sum.set(1,3);
    sum.print();
 
    sum.set(111,3);
    sum.print();
}
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.11.2015, 23:50
Грусть:
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
#include <iostream>
#include <set>
using namespace std;
struct WatchingValue;
struct LazzySumSet
{
set<WatchingValue*>sumSet;
};
 
struct WatchingValue
{
static int summa;
int value;
static LazzySumSet lazzySumSet;
WatchingValue(int val)
{
value=val;
summa+=val;
lazzySumSet.sumSet.insert(this);
}
WatchingValue& operator=(int rhs)
{   
summa+=rhs-value;
value=rhs;
return *this;
}
WatchingValue& operator=(WatchingValue& rhs)
{   
summa+=rhs.value-value;
value=rhs.value;
return *this;
}
};
 
int WatchingValue::summa=0;
LazzySumSet WatchingValue::lazzySumSet;
 
int main()
{
WatchingValue a=1, b=2, c=3, d=4, e=5;
cout<<WatchingValue::summa<<endl;//15
a=3;
cout<<WatchingValue::summa<<endl;//17
b=a;
cout<<WatchingValue::summa<<endl;//18
cout << endl;
    system("pause");
    return 0;
}
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
28.11.2015, 09:49
IGPIGP, м-да...
Ну, если отступы вставить, то должно получиться примерно следующее:
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
#include <iostream>
/////////////////////////////////////////////////////////////////////
class   T_summand
{
    //---------------------------------------------------------------
    static  int     sum_;
    int             val_;
    //---------------------------------------------------------------
public:
    //---------------------------------------------------------------
    T_summand( int  val )
        :
        val_()
    {
        *this   =   val;
    }
    //---------------------------------------------------------------
    T_summand   &   operator=( int  val )
    {
        sum_    -=  val_;
        val_    =   val;
        sum_    +=  val_;
        return  *this;
    }
    //---------------------------------------------------------------
    T_summand   &   operator=( T_summand    s )
    {
        return  *this   =   s.val_;
    }
    //---------------------------------------------------------------
    static  void    print_sum()
    {
        std::cout   <<  sum_
                    <<  std::endl;
    }
    //---------------------------------------------------------------
};
/////////////////////////////////////////////////////////////////////
int     T_summand::sum_     =   0;
/////////////////////////////////////////////////////////////////////
int main()
{
    T_summand::print_sum();
 
    T_summand   a   =   1;
    T_summand::print_sum();
 
    T_summand   b   =   2;
    T_summand::print_sum();
 
    a   =   b;
    T_summand::print_sum();
 
    a   =   b   =   3;
    T_summand::print_sum();
 
    b   =   4;
    T_summand::print_sum();
}
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
28.11.2015, 11:14
Цитата Сообщение от Mr.X Посмотреть сообщение
то должно получиться
Должно.
Вопрос можно ли добавлять переменную многократно наверное не стоит иначе нет смысла. Хотя нужно подумать. Я не стал перегружать других операторов для обёртки "наблюдателя". Вы пошли дальше сделав тип обобщённым. То есть пользователю надо бы перегрузить и его операции.
Ещё интереснее тот факт, что на числах с плавающей точкой, например, появляются эффекты которых с целыми быть не может. То есть возможно накопление погрешности, зависимость от порядка выполнения (неассоциативность сложения) и пр. и бр-р-р. То есть тоже есть о чём подумать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.11.2015, 11:14
Помогаю со студенческими работами здесь

Указатели и Ссылки
извеняюсь,но никак не могу понять. int sum(int* inLeft, int* inRight) { if(inLeft == inRight) return *inLeft; ...

Ссылки и указатели
Всем привет. Совсем запутался с ссылками и указателями. Помогите решать задачку: Функция принимает два аргумента, число с плавающей...

Указатели и ссылки
Собственно, не могу до конца осознать как это работает, вот пример из вики(комменты входят в пример) int n = 6; // Объявление...

Указатели и ссылки [С++]
Всем привет. я тут программу делаю. Цель: определить,принадлежит ли точка заданному промежутку(а точнее лежит внутри или снаружи фигуры)....

Ссылки и указатели
Здравствуйте, может кто объяснить в чем будет отличие при передаче в функцию по **, *, *&amp;, &amp;(**), желательно на примерах простых


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru