Przecią?żone strumienie...

0

Witam

Mam za zadanie zrealizować coś takiego (o ile się w ogóle da), że pisząc

np. cout << "cos";, zostaje wywolana pewna funkcja, która będzie wykonywała określone zadanie ( jeśli chodzi o konkrety, to funkcja ma realizować wypisywanie do okienek w bibliotece ncurses).

Przyznam się jednak, że nie mam pojęcia w ogóle jak to zrealizować i czy jest to możliwe...

Wszystko ma być oparte na klasach. Więc tak naprawdę, w jednej klasie fajnie by było jakby była wykonywana jedna funkcja, a dla innej - inna (bo klasy wypisują dane do różnych okien) - oczywiście nie oczekuję, że mi ktoś klasy napisze :)

Wiem, że da się dość łatwo zrealizować przykładowo przekierowanie do pliku strumienia np. cout, ale tego, co chcę osiągnąć, nie da się raczej tak zrealizować :(
Wiem też oczywiście jak definiować operatory dla klas, ale tu przecież mam mieć wypisywane "zwykłe typy": int, char, string (a być może w praktyce tylko string).

Czy ktoś ma jakiś pomysł jak to zrealizować, ma jakieś sugestie itp.? W razie czego bardzo proszę o pomoc.

Pozdrawiam

0
#include <iostream>
#include <cstdio>

std::ostream& operator<<(std::ostream &o, const char *s)
{
	printf("hello george.\n");
	return o;
}

int main()
{
	std::cout << "dfsdf";
	std::cerr << "dfsdf";	
	std::clog << "dfsdf";	
}

No oczywiscie takie przeładowanie operatora<< spowoduje, że standardowy operator już nie będzie działać... Czyli wszystkie strumienie cerr,clog i cout (wyprowadzone z ostream) są załatwione przez nasz operator<< dla const char*:(
Ale przecież mamy standardowy string w C++ :)

0

Dzięki, szczerze mówiąc jeszcze nie próbowałem, ale sam bym na to nie wpadł, że można tak po prostu zrobić.

Tak się tylko zastanawiam, czy da się taki operator uczynić składową klasy (jeśli tak to jak?) i czy da się zrealizować to, o czym wspominałem, tzn. że w jednych klasach cout <<" cos" robiłby jedną rzecz, a w innej drugą i wzajemnie te "couty" by sobie nie przeszkadzały...

Ja jestem już padnięty, po 3 dni pod rząd dostosowuję mój program do wymagań prowadzącego, a jeszcze daleka droga :/ Właśnie skończyłem zabawę z ncurses, bo chwilowo nie mam siły znów po 1000 razy stosować metody kopiuj - wklej...

0

Tak się tylko zastanawiam, czy da się taki operator uczynić składową klasy (jeśli tak to jak?)

Da się ale zmieni się sposób użycia - zmienione będą strony po których będą obiekty.
Dla zewnętrznych operatorów (nie należacych do klasy) będzie: 'strumien << klasa'
ale dla operatora zdefiniowanego w klasie będzie: 'klasa >> strumien', bo operator musi być wywołany na rzecz obiektu klasa i żeby zachować logikę przesyłania należy odwrotnie zadeklarować operatory >> wyjście a << wejście...

Pamiętaj, że zewnętrzny operator<< lub >> można (trzeba jeśli ma mieć dostęp do składowych prywatnych) zaprzyjaźnić z klasą, na której ma operować:

class A
{
    int i;
//...
    // external
    // np. A a; cout << a;
    friend ostream& operator<<(ostream &o, const A &a);
// ALBO
    // member
    // A a; a >> cout;
    ostream& operator>>(ostream &o) { return o<<i; }
};

ostream& operator<<(ostream &o, const A &a)
{
    return o << a.i;
}

i czy da się zrealizować to, o czym wspominałem, tzn. że w jednych klasach cout <<" cos" robiłby jedną rzecz, a w innej drugą i wzajemnie te "couty" by sobie nie przeszkadzały...

Dla każdej klasy możesz zdefiniować oddzielne operatory <<, >> ale jak już masz operator<< ze stringiem to drugiego nie zdefiniujesz w tym samy zakresie widoczności.

0

No właśnie, a mnie chodziło o zdefiniowanie w każdej klasie "własnego operatora cout << (char*) ", ale chyba tak jak mówisz niestety nie da się tego zrobić.
Obiekty po prawej stronie operatora mnie nie urządzają, chcę mieć tylko char* lub stringi - ale cóż, chyba odpuszczę sobie w takim razie takie rozwiązanie...

0

No właśnie, a mnie chodziło o zdefiniowanie w każdej klasie "własnego operatora cout << (char*) ", ale chyba tak jak mówisz niestety nie da się tego zrobić.

Tylko po co?? W każdej klasie ten sam operator<< ??
Masz chyba trochę problem ze spojrzeniem odpowiednim (obiektowym) na to co chcesz osiągnąć... :]
Możesz stringa do klasy wysyłać, a nie na cout:

class A; // zdefiniowany: A& operator<<(const char *), a on wysyła na cout
class B; // zdefiniowany: B& operator<<(const char *)
...
A << "dfgdfgdfg";
B << "dfgdfg";

Kwestia ustalenia co ma się naprawdę dziać i odpowiedniego zaprojektowania klas... zanim zaczniemy pisać ;P

0

Tiaa, tylko ja już mam w sumie wszystko napisane, a od 4 dni przerabiam projekt. Prowadzący sobie zażyczył czegoś takiego, chociać z mojego punktu widzenia, jest to w ogóle bez sensu i wcale nie byłoby wygodne...

A nie mogę nic wysyłać do obiektu, bo powinno to być tak zrobione, że pewne klasy dziedziczą po klasach okienkowych i jeśli dana klasa właśnie dziedziczy po klasie okienkowej, to wówczas w niej cout <<"sfdsf" powinno dać taki rezultat jak to zostało ustalone w klasie po której dziedziczy...

Może rzeczywiście to nie jest najczęściej spotykany (i rozwiązywalny) problem, ale cóż - ja tylko dostałem takie polecenia ;P

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