Долгое время читатель впервые плакат. Поиск этого очень неясен, поэтому я ничего не мог найти.
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?
Заранее спасибо за помощь.
Рассматривая свой вопрос, похоже, вы запутались в структуре типа внутри класса. Если это поможет, здесь немного объяснений с
struct test_struct
{
int foo;
string bar;
};
внутри класса вы только что создали новый тип, инкапсулированный внутри класса. (Рассматривайте это как любой другой тип). Ответы на ваши вопросы 1.t1 создается, а затем успешно сохраняется в гипотетическом массиве, но сохраняется ли он в массиве? Или он удаляется, когда функция выходит из-за изменения области?
Ответ: Да, он копирует в массив, как указано в предыдущем ответе. Его назначение копирования (бит-мудрая семантика копии), поэтому ваш элемент массива теперь имеет значение, скопированное в него из t1
Ответ: t1 - локальная переменная (выделенная в стеке), ее не является переменной-членом класса. При хранении, выделенном в куче (new), у вас есть массив элементов test_struct, а затем вы просто копируете локальное значение t1 в свой массив. По сути, вы копируете значение t1 в массив до того, как t1 будет уничтожен, когда он выходит из области видимости. Вам не нужно создавать массив для указателя на test_struct (конечно, если есть какие-то компульсивные причины, в таком случае вы также выделяете память test_struct).
ваш член "хранения" выделяется в куче, поэтому убедитесь, что вы вызываете delete [] для восстановления памяти.
Надеюсь, поможет!
string
член, конструктор копирования которого вызывается для копирования.
Время жизни не имеет ничего общего с вложением определения класса.
Это утверждение
test_struct t1;
объявляет локальную переменную, срок жизни которой заканчивается в закрывающей правой скобке блока, содержащего объявление. Он объявляет локальную переменную, потому что она находится в блоке в определении функции.
Это утверждение
storage = new test_struct [<some_size>];
динамически создает экземпляры <some_size>
test_struct
. Время жизни этого массива заканчивается, когда вы delete[]
его. Если да.
Это утверждение
storage[<some_element>] = t1;
является копией, копируя значение t1
. Он не создает новый экземпляр.
Ознакомьтесь с книжным списком SO C++, чтобы найти учебник C++, который вам подходит. Если вы можете, попросите кого-то с более высокой репутацией помочь вам, чтобы вы могли прочитать удаленные ответы. К сожалению, существующие усилия сообщества были однажды удалены и заменены резюме.
delete [] storage;
?
std::vector<test_struct> storage;
, Тогда все о себе позаботится.