2016-04-29 2 views
-2

Если я хочу создать новый экземпляр объекта в аргументе параметра (на C++), есть ли способ сделать это без использования «нового». Насколько я понимаю, использование ключевого слова «новое» означает, что мне приходится иметь дело с удалением объекта (динамическое распределение?).Создание объекта в аргументах параметров Без использования «нового»

Пример:

wrapper.set_state(new Medium()); 
+0

@icbytes Обновлен вопрос. –

+0

Действительно ли 'set_state' принимает аргумент указателя? Или это просто аргумент типа «Средний»? – ArchbishopOfBanterbury

ответ

0

Вы можете создать объект на стеке (простой звонка CTOR без нового) -> но объект будет «удален» после возврата метода.

wrapper.set_state(Medium());

+0

Я думал, что C++ имеет форму сбора мусора. –

+0

@MartinRand Nope, не по умолчанию неуправляемый C++ – ArchbishopOfBanterbury

+0

@MartinRand C++ не содержит сборку мусора, но C++ имеет концепцию жизни объекта, и вы должны использовать поведение C++ в этом отношении для вашего собственного использования. Вот почему это ** имеет ** определенное поведение, чтобы начать с: он должен сделать вашу жизнь проще. Несмотря на то, что он не содержит сборку мусора, это не означает, что он не управляет ресурсами. C++ 11 позволяет зайти очень далеко, используя семантику значений и различные типы ссылок. –

2

Пока set_state принимает параметр по константной ссылке, вы можете построить временное значение в месте вызова:

void Wrapper::set_state(const & Medium) { ... } 

Wrapper wrapper; 
wrapper.set_state(Medium()); 

Срок службы временного будет распространяться на set_state.

В противном случае, если set_state принимает указатель (возможно, это не должно!), Вам нужно держать экземпляр за пределами вызова:

void Wrapper::set_state(Medium*) { ... } 

Wrapper wrapper; 
{ 
    // Local block to explicitly manage lifetime of `medium`. 
    Medium medium; 
    wrapper.set_state(&medium); 
} 
0

При использовании «новый» вы динамически создает объект, это верно. , когда вы создаете объект с использованием «нового», вам понадобится указатель на «удерживание» этого объекта, и вы получите доступ к нему этим указателем.

В C++ 11 у вас есть умные указатели. Если вы используете умную точку, вам не нужно беспокоиться об удалении объекта. Вы можете найти хороший учебник на YouTube. Найдите учебник «Bo Quian» о умных указателях.

Если вам действительно нравится создавать и создавать объекты таким образом, вы пытаетесь создать функцию, которая создает этот объект для вас.