尝试从函数返回std :: ifstream
问题描述:
当我尝试使用此函数时,在两次返回时出现错误。如果我评论他们,我不会收到错误。这有什么理由不适用?尝试从函数返回std :: ifstream
std::ifstream bipgetConfigurationPath() {
char bipacfFilename[256], bipacfFullPath[512];
char *bipconfigPath;
char *bipdefaultConfigFile;
const char *bipdefaultConfigFileName;
bipdefaultConfigFile = "./Resources/plugins/Xsaitekpanels/D2B_config.txt";
bipdefaultConfigFileName = "D2B_config.txt";
XPLMGetNthAircraftModel(0, bipacfFilename, bipacfFullPath);
bipconfigPath = strstr(bipacfFullPath, bipacfFilename);
strncpy(bipconfigPath, bipdefaultConfigFileName, sizeof(bipacfFilename));
puts(bipacfFullPath);
// Check if ACF-specific configuration exists
std::ifstream bipcustomStream(bipacfFullPath);
if (bipcustomStream.good()) {
return bipcustomStream;
} else {
std::ifstream bipdefaultStream(bipdefaultConfigFile);
if (bipdefaultStream.good()) {
return bipdefaultStream;
}
}
}
感谢比尔
答
所有流类在C++中通过由不可复制作出自己的拷贝构造private
。这意味着,您无法按值返回流对象。详情请阅读this。故事的结局。
所以解决的办法是将流对象作为参考传递给函数,并在函数中打开文件并从中返回,或者使用new
创建流对象,并将指针从函数返回给流对象,但是如果你这样做了,当你完成它时,你必须对象delete
。我个人不会这样做。
我可能会在一个类中封装流和你想要用对象做的行为/工作。
在C++ 11中,您可以使用std::move
来移动流对象,因为流是可移动的。
答
std :: streams不可复制。
答
正如其他人所说的文件流不可复制。也许更像这样的:
bool bipgetConfigurationPath(std::ifstream& ifs) {
std::string bipdefaultConfigFileName("D2B_config.txt");
// ...
ifs.open(bipdefaultConfigFileName);
return ifs.good();
}
什么是错误? – loganfsmyth 2012-04-16 19:35:54
你有没有使用'std :: string'的原因? – AJG85 2012-04-16 19:39:51