Blog/content/posts/2023/cpp/link_to_class.md
2023-03-27 23:25:40 +03:00

4.7 KiB
Raw Blame History

title date draft tags
⤵️ Передача переменной по ссылке в C/C++ 2023-03-27T23:25:00+03:00 false
c
cpp
development
tips

Введение

Дано: передать в класс внешную переменную, чтобы её изменения во вне класса передавались в пременную класса.

Простым языком:
Мне необходимо было из класса обрабатывать данные телеметрии, значения которых изменялись в программе и хранились в объявленных перменных вне класса.

При передачи переменной variable в функцию example_func() передаётся значение перменной.

Если это значение изменить в переменной, само значение variable не изменится.

void example_func(int variable);

Для реализации цели, нужно передать в функцию значение по ссылке.
Для этого использую операнд *, символ звёдочки.

Простой пример функции, которая меняет значение переданных в неё двуъ перменных x и y.

void swap(int *x, int *y) {
    int temp;
    temp = *x; /* сохраняю значения по адресу х */
    *х = *у;   /* помещаю у в х */
    *у = temp; /* помещаю х в у */
}

Следует помнить, что swap() или любая другая функция, использующая указатели на параметры должна вызываться с адресами аргументов.

Для этого используется оператор &, символ амперсанда.

Следующая программа демонстрирует правильный способ вызова swap():

#include <stdio.h>

void swap (int *x, int *y);

int main(void) {
    int x, y;
    x = 10;
    у = 20;

    swap(&x, &y);
    printf ("%d %d", x, y);

    return 0;
}

В данном примере переменной х присваивается значение 10, а переменной у значение 20.
Затем вызывается функция swap() с адресами переменных х и у. Унарный оператор & используется для получения адресов переменных. Поэтому в функцию swap() передаются адреса переменных х и у, а не их значения.

Спасибо ресурсу c-cpp.ru за код.

Когда я кипел над кодом, то не мог вспомнить как проделать такой трюк.
(на Си последнее время пишу не часто, вот и запамятывал).
Вышеуказанную статью нагуглить получилось только в ходе написании этого руководста, а результать того, что я вспомнил самостоятельно, я расписал ниже.

Код с использованием класса

Имеется класс Example, у которого есть приватная переменная variable, которая объявлена с сиволом звёдочки.

А также конструктор и метод show().

При создании класса я передаю в него ссылку на переменную и сохраняю эту ссылку в приватной переменной класса variable.

Метод show() выводит значение перменной.

class Example {
    public:
        Example(int *xxx) { variable = xxx; }
        void show() { cout << "value: " << *variable << endl; }
    
    private:
        int *variable;
};

Полный код:

#include <iostream>

using namespace std;

class Example {
    public:
        Example(int *xxx) { variable = xxx; }
        void show() { cout << "value: " << *variable << endl; }
    
    private:
        int *variable;
};

int main() {
    int test_var = 13;
    
    Example x = Example(&test_var);
    x.show();      // тут выведется 13

    test_var = 14; // изменяю значение внешней переменной
    x.show();      // тут выведется 14
    
    return 0;
}