Чтобы достичь того, что вам нужно, у вас должен быть указатель на объект, объявленный за пределами области действия while:
//Declare the pointer to the object outside the while score. This way it will be available to you even outside of the while
HfstTransducer* t = 0;
// Initialize the object
while (not in->is_eof()) {
if (in->is_bad())
{
std::cerr << "ERROR: Stream cannot be read." << std::endl;
exit(1);
}
// Here we initialize the object using the stream only if it's not already been initialized before
// thanks to Necrolis for the observation
if(t == 0)
t = new HfstTransducer(*in);
}
Это объявит и инициализирует объект типа HfstTransducer вкуча.Это означает, что деструктор не будет вызван сам по себе после того, как вы покинете область действия, но вы должны явно вызвать его, вызвав:
delete t;
РЕДАКТИРОВАТЬ: Чтобы ответить на ваш общий вопрос о указателе против обычного объекта:
Это очень важная часть C / C ++.Статью, чтобы лучше объяснить это, можно увидеть здесь .
Если бы я объяснил это в нескольких словах, сделав:
HfstTransducer t;
Вы объявляете объекттакого типа и положить его в стек.Его срок службы длится ТОЛЬКО до конца объема.Вы не можете получить к нему доступ вне области видимости, так как его деструктор будет вызван, как только область действия закончится.
С другой стороны,
HfstTransducer*t = new HfstTransducer();
инициализирует t как объект HfstTransducer.введите и поместите его в кучу.Что касается кучи, обратитесь к статье выше, но это в основном память, выделенная вашей программе операционной системой.В C ++ вы запрашиваете память в куче с операторами new и освобождаете ее с помощью оператора delete .В C вы достигаете того же с помощью функций free () и malloc () .
Таким образом, что-то в куче живо на протяжении всей программы, если толькоВы явно называете его деструктором.Как вы можете сделать в этом примере, вызвав delete t;
Невыполнение этого требования приводит к тому, с чем сталкиваются все программисты C / C ++, к так называемым утечкам памяти.В основном это память, которую вы считаете свободной, но не потому, что вы забыли удалить / освободить ее.