• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z utworzeniem obiektu ostream

Object Storage Arubacloud
0 głosów
171 wizyt
pytanie zadane 4 lipca 2018 w C i C++ przez Sic Dyskutant (8,510 p.)

Próbowałem wielu sposobów i dodałem wszystko to co powinno być zawarte mimo wszystko, wciąż pokazuje błąd:

#include "out.h"
int main()
{
        Out result("London", 30000);
        std::ostream os;
        operator<<(os, result);
        os << result;
}//main

Dyrektywa #include <iostream>, zawarta jest w pliku nagłówkowym.

In file included from /usr/include/c++/5/iostream:39:0,
                 from out.h:4,
                 from main_out.cpp:1:
/usr/include/c++/5/ostream: In function ‘int main()’:
/usr/include/c++/5/ostream:384:7: error: ‘std::basic_ostream<_CharT, _Traits>::basic_ostream() [with _CharT = char; _Traits = std::char_traits<char>]’ is protected
       basic_ostream()
       ^
main_out.cpp:5:15: error: within this context
  std::ostream os;

 

3 odpowiedzi

+1 głos
odpowiedź 4 lipca 2018 przez 99xkubax99 Obywatel (1,780 p.)
wybrane 4 lipca 2018 przez Sic
 
Najlepsza

Witaj, 

Stworzyłeś w funkcji main() obiekt klasy ostream, jednak to nie daje znać kompilatorowi, gdzie powinny być wyprowadzane dane, dla przykładu do os możemy przypisać cout, wtedy dane zostaną wyprowadzone na ekran, ale możemy też na przykład użyć do tego zmiennej plikowej np ofstream p , więc ta deklaracja nie daje dostatecznej ilości informacji kompilatorowi. Rozumiem, że w deklaracji klasy Out przeciążyłeś metodę operator<<(). W porządku, jedyne co Ci pozostaje to w funkcji main() przekazać informację, gdzie dane powinny zostać przekazane. Wystarczy, że zastąpisz obiekt os na referencję obiektu klasy ostream i przypiszesz do niego dla przykładu obiekt cout. Z powodu referencji mógłbyś równie dobrze jako argument podać zmienną plikową, wtedy dane będą przekazywane do pliku, co jest bardziej uniwersalne.

ostream& os = cout;

Teraz powinno wszystko być w porządku 

1
komentarz 4 lipca 2018 przez Sic Dyskutant (8,510 p.)
Dziękuję to był poprawne rozwiązanie.
+1 głos
odpowiedź 4 lipca 2018 przez RafalS VIP (122,820 p.)

error: ‘std::basic_ostream<_CharT, _Traits>::basic_ostream() [with _CharT = char; _Traits = std::char_traits<char>]’ is protected

To samo potwierdza dokumentacja. Jedyny publiczny konstruktor to:

explicit basic_ostream( std::basic_streambuf<CharT, Traits>* sb );

https://en.cppreference.com/w/cpp/io/basic_ostream/basic_ostream

+1 głos
odpowiedź 4 lipca 2018 przez Bondrusiek Maniak (61,370 p.)

Witam,

może wybierz Ci obiekt zamiennik std::stringstream. Jest to strumień do obsługi łańcuchów.

http://www.cplusplus.com/reference/sstream/stringstream/str/ . Przykład może pomoże

#include <iostream>
#include <sstream>

using namespace std;

class Out
{
public:
    Out(string m, int n) : miasto(m), nr(n) {}
    string miasto;
    int nr;
    friend ostream& operator<<(ostream& stream, const Out&);
};

ostream& operator<<(ostream& stream, const Out& o)
{
    stream << o.miasto << " " << o.nr;
    return stream;
}

int main()
{
    Out result("London", 3000);
    cout << result << endl;
    stringstream ss;
    ss << result;
    cout << ss.str() << endl;
    return 0;
}

 

komentarz 4 lipca 2018 przez j23 Mędrzec (194,920 p.)
Nie musisz zaprzyjaźniać operatora, jeśli korzysta z publicznych pól i metod klasy.
komentarz 4 lipca 2018 przez Bondrusiek Maniak (61,370 p.)
A fakt. Robiłem ten przykład w pracy i na szybko. Zapomniałem dodać pol składowych(nr i miasto)do sekcji private. Dzięki za celną uwagę.

Podobne pytania

0 głosów
2 odpowiedzi 353 wizyt
0 głosów
1 odpowiedź 211 wizyt
+1 głos
0 odpowiedzi 354 wizyt

92,572 zapytań

141,422 odpowiedzi

319,645 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...