当我尝试使用此功能时,我在两次返回时收到错误。如果我评论它们,我不会得到错误。有什么理由不起作用吗?
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;
}
}
}
感谢Bill
答案 0 :(得分:6)
通过创建复制构造函数private
,C ++中的所有流类都是不可复制的。这意味着,您无法按值返回流对象。请阅读this了解详情。故事的结尾。
所以解决方法是将流对象传递给函数作为引用,并在函数中打开文件,然后从中返回,或者使用new
创建流对象并将指针返回到流对象从函数中,但是如果你这样做,那么当你完成它时,你必须delete
该对象。我个人不会做其中任何一个。
我可能会在一个类中封装流和你想对这个对象做的行为/工作。
在C ++ 11中,您可以使用std::move
移动流对象,因为流可以移动。
答案 1 :(得分:6)
std :: streams不可复制。
答案 2 :(得分:2)
正如其他人所说,文件流不可复制。也许更像是这样的事情:
bool bipgetConfigurationPath(std::ifstream& ifs) {
std::string bipdefaultConfigFileName("D2B_config.txt");
// ...
ifs.open(bipdefaultConfigFileName);
return ifs.good();
}