Объясните что делает этот код

Не могу понять логику программы и задание в целом.

Дан следующий тип данных:

struct T 
{ 
   struct _T_ 
   { 
      int* a; 
   }* p1;

   float* a; 
   int* b; 

   struct _T 
   {
      int a; 
      int b; 
      double c; 
    }* p2; 

    int c; 
};

Само задание:

Задайте каждому полю переменной value типа Т произвольное начальное значение в строке инициализации переменной

Объясните, пожалуйста, как это сделать?


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

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

Этот код объявляет пользовательский тип данных T, в котором содержатся указатели на ещё 2 пользовательских типа данных _T_ и _T.
Задание странное, с точки зрения использования имен вложенных структур - как будто специально старались запутать. Но на самом деле ничего страшного нет. Его можно только для наглядности переписать так:

struct _T_ 
   { 
      int* a; 
   };

struct _T 
   {
      int a; 
      int b; 
      double c; 
    };

struct T 
{ 
   _T_ *p1;

   float* a; 
   int* b; 

   _T *p2; 

   int c; 
};

Тогда задание значений будет так:

int main()
{
  T value{nullptr, nullptr, nullptr, nullptr, 3};
}

Что равнозначно

int main()
{
  T value;
  value.p1 = nullptr;
  value.a = nullptr; 
  value.b = nullptr; 
  value.p2 = nullptr; 
  value.c = 3; 
}

Тут по-умолчанию указателям присваиваются nullptr. Если нужны конкретные значения, то нужно сначала создать конкретные объекты, а потом присвоить указателям их адреса:

int main()
{
  T::_T_ obj1;
  T::_T  obj2;
  int var1 = 1;
  float var2 = 2.0; 

  T value;
  value.p1 = &obj1;
  value.a = &var2; 
  value.b = &var1; 
  value.p2 = &obj2; 
  value.c = 3; 
}

Либо через динамическое выделение памяти

int main()
{
  T value;
  value.p1 = new(T::_T_);
  value.a = new(float);
  ...
}

Главное не забудьте всё, что выделяли через new удалить через delete.

→ Ссылка