как вернуть потоки файлов STD - PullRequest
0 голосов
/ 15 июля 2011

Я работаю над "файловой системой" для моего приложения, чтобы обрабатывать файловые операции, такие как перечисление, создание, удаление файлов и каталогов и получение файловых данных. Я хочу использовать для этого std :: fstream, потому что его безопаснее и проще форматировать, чем обработчик C FILE. Но я не могу вернуть объект потока из функции (у него нет копии), и когда я пытаюсь вернуть ссылку, я получаю предупреждение (я не предупреждаю, это не так много, но я пытаюсь чтобы исправить все возможные предупреждения в моем приложении, и я делал все это до сих пор): «предупреждение: возвращение ссылки на временный». Что я могу сделать? Если кто-то сталкивался с такой ситуацией и нашел лучший способ справиться с этим, пожалуйста, сообщите.

EDIT:

std::ofstream &Filesystem::createFile(const String &str) {
   std::ofstream file(str);
   return file;
}

это то, чего я пытаюсь достичь. Но из-за предупреждения я ищу другой путь.

Заранее спасибо,
Гасым Гасымзаде

Ответы [ 3 ]

4 голосов
/ 15 июля 2011

Используйте умный указатель, что-то вроде может работать (или один из более новых std::unique_ptr и т. Д.)

std::auto_ptr<std::iostream> foo()
{
  return std::auto_ptr<std::iostream>(new fstream(...));
}
2 голосов
/ 20 июля 2011

В C ++ 0x потоковые объекты являются подвижными, поэтому вы можете фактически вернуть потоковый объект по значению:

// Perfectly valid C++0x
std::ofstream f()
{
    return std::ofstream("pwnies.txt");
}

В реализацию стандартной библиотеки Visual C ++ 2010 входят подвижные потоки, как и в libc ++. Если вам нужно нацелиться на более старые реализации компилятора / библиотеки, которые не поддерживают rvalue-ссылки и подвижные потоки, вы не можете этого сделать, но для нового кода, который не имеет таких ограничений, это путь.

0 голосов
/ 15 июля 2011

Вы можете передать fstream в качестве аргумента своей функции по ссылке.

fstream obj;
void Modify (fstream &obj) // no return, just pass by reference
{
 //...
}
...