From 5881d77f955c7dbd3ca7778d540f8d9b7361f64a Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Mon, 27 Mar 2023 23:25:40 +0300 Subject: [PATCH] variable by link --- content/posts/2023/cpp/link_to_class.md | 133 ++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 content/posts/2023/cpp/link_to_class.md diff --git a/content/posts/2023/cpp/link_to_class.md b/content/posts/2023/cpp/link_to_class.md new file mode 100644 index 0000000..75e50ab --- /dev/null +++ b/content/posts/2023/cpp/link_to_class.md @@ -0,0 +1,133 @@ +--- +title: "⤵️ Передача переменной по ссылке в C/C++" +date: 2023-03-27T23:25:00+03:00 +draft: false +tags: [c, cpp, development, tips] +--- + +## Введение + +Дано: передать в класс внешную переменную, +чтобы её изменения во вне класса передавались в пременную класса. + +**Простым языком:** +Мне необходимо было из класса обрабатывать данные телеметрии, +значения которых изменялись в программе +и хранились в объявленных перменных вне класса. + +При передачи переменной `variable` в функцию `example_func()` +передаётся значение перменной. + +Если это значение изменить в переменной, само значение `variable` +не изменится. + +```c +void example_func(int variable); +``` + +Для реализации цели, нужно передать в функцию значение по ссылке. +Для этого использую операнд `*`, символ звёдочки. + +Простой пример функции, которая меняет значение переданных в неё +двуъ перменных `x` и `y`. + +```c +void swap(int *x, int *y) { + int temp; + temp = *x; /* сохраняю значения по адресу х */ + *х = *у; /* помещаю у в х */ + *у = temp; /* помещаю х в у */ +} +``` + +Следует помнить, что `swap()` или любая другая функция, +использующая указатели на параметры должна вызываться с адресами аргументов. + +Для этого используется оператор `&`, символ амперсанда. + +Следующая программа демонстрирует правильный способ вызова `swap()`: + +```c +#include + +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](http://www.c-cpp.ru/books/sozdanie-peredachi-po-ssylke) +за код. + +_Когда я кипел над кодом, то не мог вспомнить как проделать такой трюк. +(на Си последнее время пишу не часто, вот и запамятывал). +Вышеуказанную статью нагуглить получилось только +в ходе написании этого руководста, а результать того, +что я вспомнил самостоятельно, я расписал ниже._ + +## Код с использованием класса + +Имеется класс `Example`, у которого есть приватная переменная +`variable`, которая объявлена с сиволом звёдочки. + +А также конструктор и метод `show()`. + +При создании класса я передаю в него ссылку на переменную +и сохраняю эту ссылку в приватной переменной класса `variable`. + +Метод `show()` выводит значение перменной. + +```cpp +class Example { + public: + Example(int *xxx) { variable = xxx; } + void show() { cout << "value: " << *variable << endl; } + + private: + int *variable; +}; +``` + +Полный код: + +```cpp +#include + +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; +} +```