0

この関数を使用しようとすると、2 つの戻り値でエラーが発生します。それらをコメントアウトすると、エラーは発生しません。これが機能しない理由はありますか?

 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::stream はコピーできません。

于 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 に答える