2014-10-21 1 views
0

왜 액세스 할 수 없습니까? 나는이 오류를 전혀 이해할 수 없다. 그것은 매우 모호하고 컴파일러에 의해 잘 설명되지 않습니다.비공개 std :: fstream 멤버에 액세스 할 수 없습니까?

Error 1 error C2248: 'std::basic_fstream<_Elem,_Traits>::basic_fstream' : cannot 
access private member declared in class 'std::basic_fstream<_Elem,_Traits>' c:\users 
\user\documents\visual studio 2012\projects\queue\queue\main.cpp 69 1 queue 

줄 69는 세미콜론으로 닫는 중괄호를 포함합니다.

class queue { 
public: 
    queue() { 
     back = NULL; 
     front = NULL; 
    } 
    void setfile(const char* to) { 
     file.open(to, std::fstream::in | std::fstream::out | std::fstream::app); 
    } 
    void push(const char* msg) { 
     file << msg << QueryPerformanceCounter(&nano::end); 
     if(front == NULL) { 
      back = new item(msg); 
      front = back; 
     } 
     else { 
      back->setprev(new item(msg)); 
      back = back->getprev(); 
     } 
    } 
    void* pop(const char* msg) { 
     file << msg << QueryPerformanceCounter(&nano::end); 
     if(front == NULL) { 
      return false; 
     } 
     else { 
      item* temp = front; 
      front = front->getprev(); 
      delete temp; 
     } 
    } 
private: 
    std::fstream file; 
    item* back; 
    item* front; 
}; 

클래스 정의 끝에있는 마지막 중괄호는 오류가 나를 가리키는 곳입니다. private std :: fstream 객체를 할당하거나 복사하려고 시도했는지 궁금 할 지 모르지만 나는 그렇지 않습니다. 클래스를 사용하는 모든 코드는 클래스 정의 내에서 인라인입니다. setfile() 함수는 외부와 상호 작용하는 유일한 코드이며, 상수 문자 인수는 파일 이름뿐입니다.

현재 MSVC++ 2012를 사용 중입니다.

답변

1

std :: fstream에는 공개 복사 생성자 또는 할당 연산자가 없습니다. 따라서, 묵시적으로 생성 된 큐 클래스 생성자는 파일 객체를 복사 할 수 없습니다.

우선, 개인용 사본 생성자의 명시 적 선언을 통해 대기열 오브젝트의 복사를 거부 할 수 있습니다. 두 번째 해결책은 fstream을 포인터가 아닌 값으로 포함시키는 것입니다. 메모리 문제를 방지하려면 간단한 포인터 대신 shared_ptr을 사용하십시오. 어떤 사용자 정의 복사 생성자 F UPDATE I

이 클래스 타입 (구조체, 클래스 또는 조합)에 제공되어, 컴파일러는 항상 인라인으로 복사 생성자를 선언합니다 동급의 공용 멤버. From cpp reference

당신이 당신의 큐 개체를 복사하지 않습니다 그래서 경우에도

는, 컴파일러는 어쨌든 복사 생성자를 생성합니다. 그리고이 생성자는 std :: fstream 객체를 복사 할 수 없습니다.

+0

어디에서 fstream 객체를 복사합니까? – thelittlegumnut

+0

@thelittlegumnut 대기열을 복사하고 있습니까? 이 코드 외부의 큐로 무엇을하고 있습니까? – 0x499602D2

+0

컴파일러는 모든 클래스에 대한 복사 생성자를 생성합니다. 많은 경우에 대기열 객체를 복사 할 수 있습니다. 예를 들어, 값으로 대기열을 함수로 전달 : void foo (queue q) {// some code} – nnesterov

관련 문제