Strumienie, Manipulatory, LOG.

0

Taki oto plik main.cpp dostaliśmy na zajęciach z programowania. Naszym zadaniem jest dopisanie plików w taki sposób
żeby program działa poprawnie. W komentarzach wewnątrz maina opisuje co kojarzę.

 
/*************          Tego pliku NIE WOLNO modyfikowac          *************/
#include "log.hpp"

void f1(void)
{
  LOG & log=LOG::get_logger();
  log <<             "[8] ? event";
}

void f2(void)
{
  LOG & log=LOG::get_logger();
  log << LOG::INFO<< "[9] ? event";
}

void f3(void)
{
  LOG & log=LOG::get_logger();
  log <<             "[10] ? event";
  log <<LOG::ERROR<< "[11] koniec";
}

int main(int argc, char *argv[])
{
 {
    LOG & log=LOG::get_logger(); //tzw konstruktor nazwany, tylko... &? W jakim celu?
    log.parse_args(argc,argv); //wyciąganie łańcuchów, raczej oczywiste
    log << LOG::TRACE   << "[1] trace event"; // i tak: wiem, że levele można zrobić za pomocą enum. Dowiedziałem się też
                                                              // że nie o to chodzi i lepiej enum nie używać. Poza tym TRACE, DEBUG, ...
                                                              // są manipulatorami. Są też... statyczne? 
    log << LOG::DEBUG   << "[2] debug event";
    log << LOG::INFO    << "[3] info event";
    log << LOG::WARNING << "[4] warning event";
    log << LOG::ERROR   << "[5] error event";
    log <<                 "[6] ? event";
    log.set_level(LOG::INFO);
    log <<                 "[7] ? event";
  }
  f1();
  f2();
  f3();
  return 0;
}

/* 
Opcje wywolania programu:
./app [-l <level>] [-c] [-f <fname>]

Opcja -l zmienia poziom logowania komunikatow, dozwolone wartosci to:
ERROR, WARNING, INFO, DEBUG, TRACE
Logowane sa tylko wiadomosci o poziomie nizszym badz rownym od obecnie ustawionego.
Jesli uzytkownik nie wyspecyfikuje tego argumentu domyslny poziom logowania 
ustawiony jest na WARNING (tzn. wyswietlane sa tylko WARNINGI i ERRORY)

Opcja -c powoduje wysylanie komunikatow na standardowe wyjscie bledow (ERROR, 
WARNING) oraz standardowe wyjscie logow (INFO, DEBUG, TRACE).

Opcja -f wraz z nastepujaca po niej nazwa plikow powoduje otworzenie (ew. utworzenie
jesli to konieczne) pliku gdzie powinny ladowac komunikaty. Jesli nazwa pliku 
jest pominieta tworzony jest plik log.txt

Przyklad dzialania programu:
./Imie_Nazwisko -l ERROR -c -f
16:26:02 19/01/2012 [ERR] [5] error event
16:26:02 19/01/2012 [ERR] [6] ? event
16:26:02 19/01/2012 [ERR] [11] koniec

./Imie_Nazwisko -l TRACE -c -f
16:26:02 19/01/2012 [TRC] [1] trace event
16:26:02 19/01/2012 [DBG] [2] debug event
16:26:02 19/01/2012 [INF] [3] info event
16:26:02 19/01/2012 [WRN] [4] warning event
16:26:02 19/01/2012 [ERR] [5] error event
16:26:02 19/01/2012 [ERR] [6] ? event
16:26:02 19/01/2012 [INF] [7] ? event
16:26:02 19/01/2012 [INF] [8] ? event
16:26:02 19/01/2012 [INF] [9] ? event
16:26:02 19/01/2012 [INF] [10] ? event
16:26:02 19/01/2012 [ERR] [11] koniec

./Imie_Nazwisko -l INFO -c -f
16:26:02 19/01/2012 [INF] [3] info event
16:26:02 19/01/2012 [WRN] [4] warning event
16:26:02 19/01/2012 [ERR] [5] error event
16:26:02 19/01/2012 [ERR] [6] ? event
16:26:02 19/01/2012 [INF] [7] ? event
16:26:02 19/01/2012 [INF] [8] ? event
16:26:02 19/01/2012 [INF] [9] ? event
16:26:02 19/01/2012 [INF] [10] ? event
16:26:02 19/01/2012 [ERR] [11] koniec

Aby uzyskac informacje o dacie systemowej prosze skorzystac z 
http://www.cplusplus.com/reference/clibrary/ctime/strftime/

*/

Pierwszy raz nie mam praktycznie kompletnego pojęcia co mogę z tym zrobić.
Na zajęciach oczywiście 0, staram się to nadrobić, ale trudno mi znaleźć jakieś informacje.
Pomoże ktoś?

Kompletnie nie rozumiem

 
log << ...

Przeciążenie strumienia wyjściowego?
Z góry dzięki;)

PS.: Nie jest to żaden projekt, nie oczekuje, że ktoś zrobi to za mnie. Po prostu naprawdę czuje się bezradny. Przepraszam również za chaos.

PS2.:
Manipulatory:

 
class Option
{
...
};

class LOG
{
...
public:
    static Option TRACE; //itd
...
};

w taki sposób?

0

A niby dlaczego nie można użyć enumów?
Ten konstruktor nazwany to tak naprawdę metoda statyczna, która zwraca referencję na obiekt swojej klasy. Z założenia może istnieć tylko jeden taki obiekt. Rzeczywiste konstruktory powinny być prywatne. Więcej na http://pl.wikipedia.org/wiki/Singleton_(wzorzec_projektowy)

0

nie tyle nie można, co jest to rozwiązanie gorsze i niżej punktowane.

0

No to możesz utworzyć taką klasę LogLevel, której obiekty będą zawierały 2 pola: poziom i nazwa poziomu. Potem tworzysz sobie stałe pola statyczne w klasie LOG i z nich korzystasz.

0

W drugim tomie Thinking in C++ masz opisane tworzenie manipulatorów, poszukaj. Wystarczy wtedy tylko dodać odpowiednie przeładowanie operatora <<.

0

No to załóżmy że tworze 5 manipulatorów:

 
static LOG& WARNING(LOG&);

LOG& LOG::WARNING(LOG& K)
{
	.... 
	return K;
}

itd.
operator musi przyjmować wskaźnik na funkcje.

LOG& operator<<(LOG& (*fun)(LOG&))
{
	....
	return ...;
}

funkcje voidową set_level można wykorzystać w manipulatorach.
Wciąż mam problem jak to wszystko poskładać, żeby miało sens...
Jakieś pomysły?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.