programing

stringstream 복사가 허용되지 않는 이유는 무엇입니까?

projobs 2021. 1. 15. 07:31
반응형

stringstream 복사가 허용되지 않는 이유는 무엇입니까?


int main()
{
   std::stringstream s1("This is my string.");
   std::stringstream s2 = s1; // error, copying not allowed
}

stringstream을 복사 할 수없는 이유를 찾을 수 없습니다. 참고 자료를 제공해 주시겠습니까?


복사 생성자를 만들면 C ++의 모든 스트림 복사가 비활성화됩니다 private.

모든 수단 ANY, 그것은 여부 stringstream, istream, ostream, iostream또는 무엇 이건.

의미가 없기 때문에 스트림 복사 가 비활성화되었습니다. 스트림이 의미 하는 바를 이해하고 실제로 스트림 복사 가 의미가없는 이유 를 이해하는 것은 매우 중요합니다 . stream복사 할 수있는 컨테이너가 아닙니다. 데이터가 포함되어 있지 않습니다.

목록 / 벡터 /지도 또는 컨테이너가 버킷 인 경우 스트림은 데이터 가 흐르는 호스 입니다. 일부 파이프와 같은 스트림 생각 을 통해 데이터를 얻을 수있는, 파이프-한쪽에는 소스 (송신자)가 있고 다른쪽에는 싱크 (수신기)가 있습니다. 이를 단방향 스트림이라고합니다. 데이터 양방향으로 흐르는 양방향 스트림도 있습니다 . 그렇다면 그러한 것을 복사하는 것이 의미가있는 것은 무엇입니까? 데이터가 전혀 포함되어 있지 않습니다. 그것은이다 통해 어떤 데이터를 얻을.

지금은 가정 동안 스트림의 복사본을 허용하고, 당신이 만든 만드는 경우 사본std::cin사실 입력 스트림 인을. 복사 된 개체가 copy_cin. 이제 스스로에게 물어보십시오 : copy_cin동일한 데이터를 이미 std::cin.No에서 읽었을 때 스트림 에서 데이터를 읽는 것이 합리적입니까? 사용자가 데이터를 한 번만 입력했기 때문에 키보드 (또는 입력 장치)가 생성 되었기 때문입니다. 전기 신호는 한 번만 전달되고 다른 모든 하드웨어와 저수준 API를 통해 한 번만 흐릅니다. 프로그램이 어떻게 두 번 이상 읽을 수 있습니까?

따라서 사본 생성 은 허용되지 않지만 참조 생성 은 허용됩니다.

std::istream  copy_cin = std::cin; //error
std::istream & ref_cin = std::cin; //ok

또한 스트림의 다른 인스턴스를 만들고 이전 스트림이 현재 사용하고 있는 동일한 기본 버퍼사용하도록 만들 수 있습니다 . 이것을보십시오 : https://ideone.com/rijov


질문에 직접 답하려면 stringstream 클래스의 복사 생성자가 private으로 선언 되었기 때문에 복사 할 수 없습니다.

대부분의 경우 스트림을 복사하는 것이 어색해 보이기 때문에 그렇게 선언되었을 것입니다. 따라서 스트림 클래스에는 공용 복사 생성자가 없습니다.


위에서 언급했듯이 스트림을 복사 할 수 없지만 필요한 경우 데이터를 복사 할 수 있습니다.

std::stringstream from;
std::stringstream to;

std::copy(std::istream_iterator<char>(from), std::istream_iterator<char>(),
          std::ostream_iterator<char>(to));

참조 URL : https://stackoverflow.com/questions/6010864/why-copying-stringstream-is-not-allowed

반응형