Dlaczego nie mogę utworzyć obiektu ostream?
Ostatnio zmodyfikowano 2017-11-25 13:09
Gradus Temat założony przez niniejszego użytkownika |
Dlaczego nie mogę utworzyć obiektu ostream? » 2017-11-25 08:44:22 Witam
Tak jak w temacie. Dlaczego utworzenie obiektu ostream jest niedozwolone? Kompilator wyrzuca błąd: cannot access private member declared in class 'std::basic_ostream<_Elem,_Traits>'. czyli że jest to prywatny element klasy, ale nie rozumiem dlaczego jest prywatny... Poniżej zamieściłem funkcję zaprzyjaźnioną która ma zwracać kopie obiektu ostream, oczywiście nie chce działać. Natomiast kompilator w ogóle nie protestuje gdy w scopie tej funkcji tworzy się zmienna automatyczna ostream os... Wiem, że należałoby użyć referencji ale chce zrozumieć dlaczego to nie działa bez referencji. Dzięki za wszelką pomoc:)
ostream operator<<(ostream os, const Time & t) { os << t.hours << " godzin, " << t.minutes << " minut"; return os; }
|
|
Monika90 |
» 2017-11-25 09:39:56 ostream przekazuj przez referencję i zwracaj przez referencję. A nie można kopiować bo jest to klasa abstrakcyjna (w pewnym sensie). Zabronienie kopiowania pozwala uniknąć slicingu.
W C++17 da się ostream zwrócić przez wartość z powodu obowiązkowego copy-elision. |
|
Gradus Temat założony przez niniejszego użytkownika |
» 2017-11-25 10:34:14 Co masz na myśli mówiąc o abstrakcji tej klasy? Co to znaczy, jakie są tego konsekwencje? |
|
Gradus Temat założony przez niniejszego użytkownika |
» 2017-11-25 11:06:55 I dlaczego kompilator pozwala na utworzenie zmiennej ostream os w scopie funkcji, skoro jest tak jak mowisz |
|
Monika90 |
» 2017-11-25 13:09:16 Zapomnijmy o klasie abstrakcyjnej. Faktycznie, jeżeli nie wszystkie konstruktory są protected, to można tworzyć samodzielne obiekty, więc nie ma sensu mówić o klasie abstrakcyjnej.
Nie wiem dlaczego ostream jest niekopiowalne. Prawdopodobnie z powodu trudności w ustaleniu, jak to kopiowanie powinno się zachowywać (np. czy kopia i oryginał powinny współdzielić bufor, czy nie?). Łatwiej było zabronić kopiowania. |
|
« 1 » |