Problem z ifsteam przy prostym dziedziczeniu klas

0

Cześć. Mam prosty kod (wszystko w jednym pliku). Dwie klasy, jedna dziedziczy po drugiej. Pierwsza ma być abstrakcją, druga konkretna. Pozostałe metody wyciąłem dla przejrzystości. Plik wygląda tak:

#include<fstream>

int main() {
   return 0;
}

namespace myspace {
   using std::ifstream;

   class A {
   protected:
      A(const ifstream& in) : _in(in) {};
   private:
      ifstream _in;
   };

   class B : public A {
   public:
      B(const ifstream& in) : A(in) {};
   };
}

A błąd (w czasie kompilacji) jest taki:

test.cpp:12:33: error: use of deleted function ‘std::basic_ifstream<_CharT, _Traits>::basic_ifstream(const std::basic_ifstream<_CharT, _Traits>&) [with _CharT = char; _Traits = std::char_traits<char>]’
   A(const ifstream& in) : _in(in) {};
                                 ^
In file included from test.cpp:1:0:
/usr/lib/gcc/x86_64-pc-cygwin/5.4.0/include/c++/fstream:519:7: note: declared here
       basic_ifstream(const basic_ifstream&) = delete;
       ^

Kompiluję za pomocą kompilatora GCC 5.4.0 z opcją -std=c++11. Nie rozumiem tego błędu, jak się go pozbyć? Wszystko robię tak jak w tutorialach (wywoływanie konstruktorów z klas bazowych i używanie listy inicjalizacyjnej konstruktora).

3

W jaki niby sposób widzisz kopiowanie fstream?
Strumieni plików kopiować nie można.

2

W tutorialach używasz typów które można kopiować. std::ifstream jest niekopiowalny.

0

Dobrze rozumiem, że klasa ifstream już jako sama klasa jest niekopiowalna? czyli nawet utworzenie konstruktorów kopiujących dla klas A i B nic tu nie da, bo to o co innego chodzi? A gdybym przesyłał przez wskaźnik zamiast referencji? Powinno zadziałać?

Edit: myślałem, że po to są właśnie referencję, żeby nie kopiować całych obiektów gdy się je przekazuje do metod/konstruktorów. Dlatego właśnie zresztą użyłem referencji.

2

Nie ma to znaczenia, bo masz kopię w klasie A. Gdyby jej elementem była referencja/wskaźnik to by było ok.

1 użytkowników online, w tym zalogowanych: 0, gości: 1