C ++ Struct объявлен внутри класса

0

Долгое время читатель впервые плакат. Поиск этого очень неясен, поэтому я ничего не мог найти.

Anywho, если я объявляю структуру внутри класса. Тогда у меня есть метод класса, который создает экземпляры указанной структуры, какова продолжительность жизни созданного экземпляра структуры?

Например, в моем заголовке:

class test_class
{
     Public:
          void test_function(int, string);

     private:
          struct test_struct
          {
               int foo;
               string bar;
          };

          test_struct * storage;
}

Затем в test_class.cpp

void test_function(int num, string name)
{
     test_struct t1;
     t1.foo = num;
     t1.bar = name;

     storage = new test_struct [<some_size>];
     storage[<some_element>] = t1;
}

Итак, я делаю экземпляр своего test_class и вызываю test_function. t1 создается, а затем сохраняется в гипотетическом массиве, но сохраняется ли в массиве? Или он удаляется, когда функция выходит из-за изменения области? Является ли t1 переменной-членом класса? Мне нужно, чтобы t1 был указателем на test_struct и имел массив указателей test_struct?

Заранее спасибо за помощь.

  • 0
    Вместо использования указателей используйте std::vector<test_struct> storage; , Тогда все о себе позаботится.
  • 0
    К сожалению, я должен сделать это таким образом. Это не само назначение, а сокращение идеи. Я представляю приоритетную очередь с кучей, представленной массивом @. @
Показать ещё 6 комментариев
Теги:
class
arrays
pointers
struct

2 ответа

-1
Лучший ответ

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

      struct test_struct
      {
           int foo;
           string bar;
      };

внутри класса вы только что создали новый тип, инкапсулированный внутри класса. (Рассматривайте это как любой другой тип). Ответы на ваши вопросы 1.t1 создается, а затем успешно сохраняется в гипотетическом массиве, но сохраняется ли он в массиве? Или он удаляется, когда функция выходит из-за изменения области?

Ответ: Да, он копирует в массив, как указано в предыдущем ответе. Его назначение копирования (бит-мудрая семантика копии), поэтому ваш элемент массива теперь имеет значение, скопированное в него из t1

  1. Является ли t1 переменной-членом класса? Мне нужно, чтобы t1 был указателем на test_struct и имел массив указателей test_struct?

Ответ: t1 - локальная переменная (выделенная в стеке), ее не является переменной-членом класса. При хранении, выделенном в куче (new), у вас есть массив элементов test_struct, а затем вы просто копируете локальное значение t1 в свой массив. По сути, вы копируете значение t1 в массив до того, как t1 будет уничтожен, когда он выходит из области видимости. Вам не нужно создавать массив для указателя на test_struct (конечно, если есть какие-то компульсивные причины, в таком случае вы также выделяете память test_struct).

ваш член "хранения" выделяется в куче, поэтому убедитесь, что вы вызываете delete [] для восстановления памяти.

Надеюсь, поможет!

  • 0
    -1 «Это назначение копирования (семантика побитового копирования)», нет, это не побитовое копирование. Даже не как особый случай для этого конкретного примера. Этот пример включает string член, конструктор копирования которого вызывается для копирования.
  • 0
    Что это за утверждение? хранилище [<some_element>] = t1; Разве это не операция присваивания? Когда назначение произойдет, участник будет скопирован побитовым способом. Однако std :: string имеет собственную реализацию присваивания, которая выполняет глубокое копирование. Не уверен, почему вы проголосовали, прежде чем понять заявление в его целостности.
Показать ещё 7 комментариев
1

Время жизни не имеет ничего общего с вложением определения класса.

Это утверждение

 test_struct t1;

объявляет локальную переменную, срок жизни которой заканчивается в закрывающей правой скобке блока, содержащего объявление. Он объявляет локальную переменную, потому что она находится в блоке в определении функции.

Это утверждение

 storage = new test_struct [<some_size>];

динамически создает экземпляры <some_size> test_struct. Время жизни этого массива заканчивается, когда вы delete[] его. Если да.

Это утверждение

storage[<some_element>] = t1;

является копией, копируя значение t1. Он не создает новый экземпляр.


Ознакомьтесь с книжным списком SO C++, чтобы найти учебник C++, который вам подходит. Если вы можете, попросите кого-то с более высокой репутацией помочь вам, чтобы вы могли прочитать удаленные ответы. К сожалению, существующие усилия сообщества были однажды удалены и заменены резюме.

  • 0
    Спасибо, что вернулись ко мне. То есть экземпляр структуры t1 копируется в указанный элемент массива хранения? Затем, когда функция завершается, срок жизни оригинального t1 заканчивается, но копия сохраняется в хранилище, пока хранилище не будет delete [] storage; ?
  • 0
    да, вот и все.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню