0

当我尝试使用此功能时,我在两次返回时收到错误消息。如果我将它们注释掉,我不会得到错误。有什么理由不应该这样做吗?

 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;
        }

    }
}

谢谢比尔

4

3 回答 3

6

C++ 中的所有流类都通过制作它们的 copy-constructor 变得不可复制private。这意味着,您不能按值返回流对象。详细阅读内容。故事的结局。

所以解决方案是将流对象作为引用传递给函数,并在函数中打开文件,然后从它返回,或者使用创建流对象new并从函数返回指向流对象的指针,但是如果你这样做,delete当你完成它时,你已经到了对象。我个人不会做其中任何一个。

我可能会将流和您想对对象执行的行为/工作封装在一个类中。

在 C++11 中,您可以使用std::move来移动流对象,因为流是可移动的。

于 2012-04-16T19:37:54.867 回答
6

std::streams 不可复制。

于 2012-04-16T19:37:58.127 回答
2

正如其他人所说,文件流不可复制。也许更像这样:

bool bipgetConfigurationPath(std::ifstream& ifs) {

    std::string bipdefaultConfigFileName("D2B_config.txt");

    // ...

    ifs.open(bipdefaultConfigFileName);
    return ifs.good();
}
于 2012-04-16T19:45:24.860 回答