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

134 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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 <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](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 <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;
}
```