Предполагая, что это не вариант, вы можете, по крайней мере, уменьшить количество копий строк до одной. Передайте строку как указатель ссылки на setName (), а затем выполните копирование внутри самой функции setName (). Таким образом, вы можете быть уверены, что копия выполняется только один раз.

роблема выделения памяти, которую я никогда не понимал.

void unleashMonkeyFish()  
{  
    MonkeyFish * monkey_fish = new MonkeyFish();
    std::string localname = "Wanda";  
    monkey_fish->setName(localname);  
    monkey_fish->go();  
}  

В приведенном выше коде я создал объект MonkeyFish в куче, присвоил ему имя и затем применил его к миру. Предположим, что право собственности на выделенную память было передано самому объекту MonkeyFish - и только сам MonkeyFish решит, когда ему умирать, и удалит себя сам.

Теперь, когда я определяю элемент данных «name» внутри класса MonkeyFish, я могу выбрать один из следующих:

std::string name;
std::string & name;

Когда я определяю прототип для функции setName () внутри класса MonkeyFish, я могу выбрать один из следующих:

void setName( const std::string & parameter_name );
void setName( const std::string parameter_name );

Я хочу иметь возможность минимизировать копии строк. На самом деле, я хочу полностью устранить их, если смогу. Итак, похоже, что я должен передать параметр по ссылке ... правильно?

Что меня беспокоит, так это то, что моя локальная переменная выйдет из области действия после завершения функции unleashMonkeyFish (). Означает ли это, что я вынужден передать параметр при копировании? Или я могу передать его по ссылке и как-нибудь "сойти с рук"?

По сути, я хочу избежать этих сценариев:

Я не хочу устанавливать имя MonkeyFish только для того, чтобы память для строки localname исчезла, когда завершится функция unleashMonkeyFish (). (Кажется, это было бы очень плохо.)Я не хочу копировать строку, если смогу помочь.Я бы предпочел не новое местное имя

Какую комбинацию прототипа и члена данных я должен использовать?

ПОЯСНЕНИЯ: В нескольких ответах предлагалось использовать ключевое слово static, чтобы гарантировать, что память не будет автоматически выделяться при завершении unleashMonkeyFish (). Поскольку конечной целью этого приложения является раскрытие N MonkeyFish (все из которых должны иметь уникальные имена), это нереальный вариант. (И да, MonkeyFish - непостоянные существа - часто меняют свои имена, иногда несколько раз в течение одного дня.)

РЕДАКТИРОВАТЬГрег Хьюгил (Greg Hewgil) указал, что хранить переменную name как ссылку запрещено, поскольку она не устанавливается в конструкторе. Я оставляю ошибку в вопросе как есть, так как думаю, что моя ошибка (и исправление Грега) может быть полезна для того, кто впервые видит эту проблему.

Ответы на вопрос(9)

Ваш ответ на вопрос