2012-04-16 7 views
0

이 함수를 사용하려고하면 두 반환시에 오류가 발생합니다. 내가 그들에게 말하면 나는 오류를 얻지 못한다. 이것이 작동하지 않아야하는 이유가 있습니까? 에 의해 noncopyable 만들어진 C++에서함수에서 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

+1

'std :: string'을 사용하지 않는 이유는 무엇입니까? – AJG85

답변

6

모든 스트림 클래스는 복사 생성자 private을 만들었던 것이지. 즉, 값으로 스트림 객체를 반환 할 수 없습니다. 자세한 내용은 this을 참조하십시오. 이야기의 끝.

따라서 스트림 객체를 함수로 전달하고 함수에서 파일을 열고 반환하거나 new을 사용하여 스트림 객체를 만들고 함수에서 스트림 객체에 포인터를 반환합니다. , 그렇다면 그렇게하면 개체를 완료 한 후 delete 개체로 이동했습니다. 나는 개인적으로 그들 중 누구도하지 않을 것이다.

아마도 클래스에서 객체로 수행하고자하는 스트림 및 동작/작업을 캡슐화 할 것입니다.

C++ 11에서는 std::move을 사용하여 스트림 개체를 이동할 수 있으므로 스트림 개체를 이동할 수 있습니다.

+1

C++ 11에서는 스트림 객체가 이동 가능하기 때문에 값으로 스트림 객체를 반환 할 수 있습니다. 이것은 순전히 C++ 03 제한 사항입니다. – ildjarn

+0

'std :: move()'를 추천하지 않는 이유는 무엇입니까? (C++ 11을 지정하지 않은 OP 제외) –

+0

@ChetSimpson : 지금 언급했습니다. 감사. :-) – Nawaz

6

std :: streams는 복사 할 수 없습니다.

2

다른 사람들은 파일 스트림을 복사 할 수 없다고합니다. 아마도 다음과 같은 것일 수 있습니다 :

bool bipgetConfigurationPath(std::ifstream& ifs) { 

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

    // ... 

    ifs.open(bipdefaultConfigFileName); 
    return ifs.good(); 
} 
관련 문제