Члены данных/переменные-члены класса в виде ссылок/указателей

StackOverflow!!! У меня возник вопрос по поводу одного примера из книги "C++.Практика многопоточного программирования".Автор реализует класс в котором переменные-члены(члены данных) используются в качестве ссылок(в других примерах,в качестве указателей).То есть:

#include<iostream>
using std::cout;
using std::endl;
class Secret
{
private:
  int *m_value;
  int &m_number;
public:
  Secret(int value = 1001, int number = 110);
  int GetSecret();
  void SetSecret(int value, int number);
};
Secret::Secret(int value = 1001, int number = 110)
{
  *m_value = value;
  m_number = number;

}
int Secret::GetSecret()
{
  return *m_value;
  return m_number;
}
void Secret::SetSecret(int value, int number)
{
  m_value = &value;//В этой строке явно что-то не так
  m_number = number;//В этой тоже.Неплохо было бы объяснить что не так.
}
int main()
{
  Secret secret1;
  
} 

Я знаю,что код не очень,но все же я его быстро набросал чтобы дать хоть какую-нибудь ясность.

Главный вопрос:"Можно ли создавать члены-данных класса в виде ссылок/указателей и для чего это надо??? Объясните пожалуйста!

+мне кажется в конструкторе полная лабуда получится???


Ответы (1 шт):

Автор решения: AlexGlebe

Члены данных как указатель или ссылка нужна для удалённого управления данными. Если например, несколько объектов хранят указатель на общее число, то эти объекты могут удалённо менять данные.

Меняем конструктор, который просто указывает, с какими данными нужно связаться. И вызываем функцию объекта. Эта функция будет менять значения удалённо.

#include<iostream>
using std::cout;
using std::endl;
class Secret
{
private:
  int *m_value;
  int &m_number;
public:
  Secret(int * value , int & number );
  int GetSecret();
  void SetSecret(int value, int number);
};
Secret::Secret(int * value , int & number ) :
 m_value ( value) ,m_number ( number)
{
}
int Secret::GetSecret()
{
  return *m_value;
  return m_number;
}
void Secret::SetSecret(int value, int number)
{
  // в переменную по адресу даём новое значение
  * m_value = value; 
  // в переменную по внутренней ссылке даём новое значение
  m_number = number;
}
int main()
{
  int val = 0 ;
  int num = 1 ;
  cout <<"val="<<val<<" num="<<num<<endl;
  // назначаем в классе указатель и ссылку
  Secret secret1(&val,num);
  // функция меняет значения по указателю и ссылке
  secret1.SetSecret(2,3);
  cout <<"val="<<val<<" num="<<num<<endl;
} 

Результат :

$ ./a.out 
val=0 num=1
val=2 num=3
→ Ссылка