2012-04-16 64 views
0

当我尝试使用此函数时,在两次返回时出现错误。如果我评论他们,我不会收到错误。这有什么理由不适用?尝试从函数返回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; 
     } 

    } 
} 

感谢比尔

+6

什么是错误? – loganfsmyth 2012-04-16 19:35:54

+1

你有没有使用'std :: string'的原因? – AJG85 2012-04-16 19:39:51

回答

6

所有流类在C++中通过由不可复制作出自己的拷贝构造private。这意味着,您无法按值返回流对象。详情请阅读this。故事的结局。

所以解决的办法是将流对象作为参考传递给函数,并在函数中打开文件并从中返回,或者使用new创建流对象,并将指针从函数返回给流对象,但是如果你这样做了,当你完成它时,你必须对象delete。我个人不会这样做。

我可能会在一个类中封装流和你想要用对象做的行为/工作。

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

+1

在C++ 11中,您可以按值返回流对象,因为它们是可移动的;这纯粹是C++ 03的限制。 – ildjarn 2012-04-16 19:44:42

+0

不推荐'std :: move()'的任何理由? (OP不指定C++ 11) – 2012-04-16 19:44:48

+0

@ChetSimpson:现在提及它。谢谢。 :-) – Nawaz 2012-04-16 19:46:21

6

std :: streams不可复制。

2

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

bool bipgetConfigurationPath(std::ifstream& ifs) { 

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

    // ... 

    ifs.open(bipdefaultConfigFileName); 
    return ifs.good(); 
}