C++ 如何返回std文件流

C++ 如何返回std文件流,c++,g++,std,C++,G++,Std,我正在为我的应用程序开发一个文件系统,以处理文件操作,如列出、创建、删除文件和目录,以及获取文件数据。我想使用std::fstream来实现这一点,因为它比C文件处理程序更安全、更容易格式化。但是我不能从函数返回流对象,因为它没有一个副本,当我试图返回引用时,我得到了一个警告,我不是警告,这并不意味着什么,但我正在尝试修复我的应用程序中所有可能的警告,我做了所有这一切,直到现在:警告:返回对临时的引用。我能做什么?如果有人遇到这种情况并找到了更好的处理方法,请告诉我 编辑: 这就是我想要达到的目

我正在为我的应用程序开发一个文件系统,以处理文件操作,如列出、创建、删除文件和目录,以及获取文件数据。我想使用std::fstream来实现这一点,因为它比C文件处理程序更安全、更容易格式化。但是我不能从函数返回流对象,因为它没有一个副本,当我试图返回引用时,我得到了一个警告,我不是警告,这并不意味着什么,但我正在尝试修复我的应用程序中所有可能的警告,我做了所有这一切,直到现在:警告:返回对临时的引用。我能做什么?如果有人遇到这种情况并找到了更好的处理方法,请告诉我

编辑:

这就是我想要达到的目标。但由于警告,我正在寻找另一种方法

提前感谢,,
Gasim Gasimzada

使用智能指针,例如可以工作或使用较新的std::unique\u ptr等


使用智能指针,例如may work或更新的std::unique\u ptr等

您可以通过引用将fstream作为参数传递给函数

fstream obj;
void Modify (fstream &obj) // no return, just pass by reference
{
 //...
}
您可以通过引用将fstream作为参数传递给函数

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

在C++0x中,流对象是可移动的,因此实际上可以按值返回流对象:

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

VisualC++ 2010标准库实现包括可移动流,LIbc++也是如此。如果您需要针对不支持右值引用和可移动流的较旧编译器/库实现,您不能这样做,但对于没有任何此类约束的新代码,这是一种方法。

在C++0x中,流对象是可移动的,因此您实际上可以按值返回流对象:

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


VisualC++ 2010标准库实现包括可移动流,LIbc++也是如此。如果您需要针对不支持右值引用和可移动流的较旧编译器/库实现,您不能这样做,但对于没有任何此类约束的新代码,这是一种方法。

发布代码,包括确切的编译器消息和导致它们的行。@Gasim:请发布代码,警告:返回对临时对象的引用正是指:您创建了一个临时对象,然后尝试返回对它的引用。这不起作用,因为临时对象在超出范围时会被销毁。请发布您的代码,包括确切的编译器消息和导致它们的行。@Gasim:请发布代码,这将比描述更改更有用。警告:返回对临时对象的引用确切地表示:您创建了临时对象,然后尝试返回对它的引用。这不起作用,因为临时文件在超出范围时会被销毁。+1。我个人会在很多情况下找到指向std::iostream cleaner的指针,因为它更一般。@larsmans,没错,但是您如何传达所有权?谁负责清理等等。我指的不是赤裸裸的指针。独一无二的ptr将是这一款的最佳选择。@larsmans,哦,糟糕-对不起,我刚刚收到你的评论。。。哎呀,我会用指针来修正答案,这是我的一个想法,但我在做一些事情时遇到了麻烦,比如:foo+1。我个人会在很多情况下找到指向std::iostream cleaner的指针,因为它更一般。@larsmans,没错,但是您如何传达所有权?谁负责清理等等。我指的不是赤裸裸的指针。独一无二的ptr将是这一款的最佳选择。@larsmans,哦,糟糕-对不起,我刚刚收到你的评论。。。哎呀,我会修正答案使用指针是我的想法之一,但我在做这样的事情时遇到了麻烦:foo这不是很优雅,因为你需要记录Modify将对fstream做什么&客户端需要进行分配。这样,在Modify内部不能进行初始化我的想法是实际创建流并返回它供应用程序使用。这不是很优雅,因为您需要记录Modify将对fstream执行的操作&客户端需要执行分配。这样,初始化不能在Modify内部发生我的想法是实际创建流并返回它供应用程序使用。