вектор ofstream указателей

Вот моя проблема, мне нужно создать X количество файлов и записать в них в зависимости от различных фактов, мое решение было создать вектор указателей ofstream, как это

#include <boost/algorithm/string.hpp>
#include <vector>
#include<string>
#include <iostream>
#include <fstream>
vector<ofstream*> files;
files.resize(SplitVec.size()-4);
for(i=0;i<SplitVec.size()-4;i++)
{
line="/Users/jorge/Desktop/testing/strain_"+lexical_cast<string>(i);
cout<<"ine"<<endl;
files[i]=new ofstream(line.c_str());
}

До этой части он создает файлы великолепно, а потом в программе, которую я пишу для них, и это тоже здорово, моя проблема в том, когда я хочу закрыть объекты, если я использую:

for(i=0;i<SplitVec.size()-4;i++)
{
*files[i].close();
}

Я получаю следующую ошибку:

In file included from main.cpp:14:./methyl.h:298: error: request for member 'close' in 'files. std::vector<_Tp, _Alloc>::operator[] [with _Tp = std::ofstream*, _Alloc = std::allocator<std::ofstream*>](1ul)', which is of non-class type 'std::ofstream*'

Итак, у меня есть вопрос, во-первых, почему я не могу вызвать close, это указатель на ofstream, так что с * files [i] я бы подумал, что смогу закрыть его, во-вторых, если я не закрою его, Программа работает нормально, но я почти уверен, что это плохая практика и не хочу быть ленивым или дрянным программистом. Я выглядел так же, как мог, но я не смог найти ответ.
Спасибо!!!

5

Решение

Ваш код не является безопасным для исключения (например, если выдается исключение, поскольку у вас есть вектор сырье указатели, они утечка — со связанными ручками потока).

Я бы предложил современный C ++ RAII подход.

Например, если вы используете умный указатель, как shared_ptr (из Boost или из C ++ 11 <memory> заголовок), вы можете построить vector из shared_ptrи использовать make_shared выделить ofstream объекты:

// RAII exception-safe approach
vector<shared_ptr<ofstream>> files;

// Add a new ofstream object to the vector:
files.push_back( make_shared<ofstream>( filename ) );

Когда вектор выходит из области видимости, он разрушается, и все указанные объекты потока автоматически Выпущено: очень просто, понятно и безопасно для исключений.

Если вы хотите принудительно очистить потоки до того, как вектор выйдет из области видимости, вы можете просто вызвать .clear() метод на вектор.

(Альтернативой может быть использование C ++ 11 двигаться семантике-питание unique_ptrи определить vector<unique_ptr<ofstream>>, но, к сожалению, нет стандартного эквивалента make_shared за unique_ptrи код может быть немного более многословным, если вы не напишите собственную реализацию make_unique, лайк тот, который предложил Херб Саттер.)

Обратите внимание, что обычный files[i]->close() Синтаксис применяется также в этом случае вектора умный указатели.

5

Другие решения

использование

(*files[i]).close();

или напрямую

files[i]->close();
9

По вопросам рекламы [email protected]