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

Problem z utworzeniem obiektu ostream

0 głosów
357 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,460 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 (195,220 p.)
Nie musisz zaprzyjaźniać operatora, jeśli korzysta z publicznych pól i metod klasy.
komentarz 4 lipca 2018 przez Bondrusiek Maniak (61,460 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 583 wizyt
0 głosów
1 odpowiedź 291 wizyt
0 głosów
1 odpowiedź 514 wizyt

93,692 zapytań

142,611 odpowiedzi

323,220 komentarzy

63,220 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...