Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Dlaczego nie mogę utworzyć obiektu ostream?

Ostatnio zmodyfikowano 2017-11-25 13:09
Autor Wiadomość
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;
}
P-167170
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.
P-167171
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?
P-167172
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
P-167173
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.
P-167176
« 1 »
  Strona 1 z 1