[an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]
 
[an error occurred while processing this directive] [an error occurred while processing this directive]
Skåne Sjælland Linux User Group - http://www.sslug.dk Home   Subscribe   Mail Archive   Forum   Calendar   Search
MhonArc Date: [Date Prev] [Date Index] [Date Next]   Thread: [Date Prev] [Thread Index] [Date Next]   MhonArc
 

Re: [PROGRAMMERING] [C++] new class, fail. Ønskes: NULL pointer



On Tue, Jan 13, 2004 at 02:18:40PM +0100, Hans Schou wrote:
> On Tue, 13 Jan 2004, Jakob Oestergaard wrote:
> 
> > Spørgsmål: hvorfor har du en link.additem() ?  Hvorfor ikke bruge en
> > STL liste?
> 
> Jeg har tidligere spurgt her på listen om hvordan man "rigtigt" koder 
> en hægtet liste, og nogen sagde STL var overkill, andre sagde at det 
> ikke var.

Ok - det kan man sige meget om, men det skal man nok ikke  ;)

STL er "godt".  Folk der ikke kender det kan mene om det hvad de vil ;)

> 
> Her er min gl. test-kode:
> http://www.sslug.dk/~chlor/cpp/linked.cpp.txt

Jeg ville *klart* anbefale dig bare at bruge std::list<> - altså, STL
liste implementationen.

Den kan hvad din liste implementation kan, plus en masse mere. Så
slipper man for selv at sidde og genopfinde den tallerken  :)

> 
> > Spørgsmål 2: hvorfor lave en liste af pointere til objekter istedet
> > for blot en liste af objekter ?
> 
> Hmm, nok fordi jeg ikke lige vidste hvordan man gør det.
> 
> Måske jeg skulle købe en bog om C++ :-)

Bjarne's bog er at anbefale - god som reference, og kan læses som
skønlitteratur hvis man er til den slags  ;)

The C++ Programming Language, 3. udgave

> 
> > Hvis du kort kan forklare hvad det er du skal, lover jeg at komme
> > med et pænt og simpelt eksempel som ikke lækker ;)
> 
> Programmet har et antal mulige "terminaler", input/output enheder 
> såsom skærm, joystick og mus. Disse angives på kommandolinien og 
> tilføjes så til denne hægtede liste. Hvis så det fejler med fx 
> joystick, så kunne jeg da vælge at reboote eller formatere harddisken, 
> eller alternativt blot køre videre uden joystick. Her valgte jeg så 
> det sidste.
> 
> Når der så sker en event fra en "terminal", kalder jeg blot
> 	cmd = link.getcommand();
> Tilsvarende har jeg nogle skærm-update funktioner, som dog ikke er 
> relateret til fx joystick, men det ved joystick jo selv.

Ok - hvis du har en liste af 'terminal' objekter som enten virker eller
ikke virker, så er det letteste vel blot at lade metoderne i terminal
objekterne smide en exception hvis den pågældende terminal ikke kan
udføre opgaven (eksempelvis fordi den ikke er tilsluttet/virker/...).

Dvs. lav listen indeholdende alle objekter hvadenten de virker eller ej.
Dit event-loop skal så blot se ud som noget med:

 while (!done) {
  terminal *t = get_next_event();
  try {
   T cmd = t->getcommand();
   // .... treat command ....
  } catch (terminal_error e) {
   std::cerr << "Terminal error: " << e << std::endl;
   // ... other error handling ...
  }
  // ...
 }

Alternativt kan du have en liste af terminal objekter der virker - men
så skal du vel (?) håndtere at et terminal objekt pludseligt holder op
med at virke, og derefter fjerne det fra listen (?)

Hvis du ikke kan rende ind i exceptions under kommando-håndteringen, kan
det være at det er pænere at undlade exceptions, og så blot definere en
"fejl" kommando:

 while (!done) {
  terminal *t = get_next_event();
  T cmd = t->getcommand();
  if (cmd == ERROR_CMD) {
   std::cerr << "Terminal error: " << e << std::endl;
   // ... other error handling ...
   continue;
  }
  // ... treat command ...
 }

Det er en afvejning...

Men for at komme tilbage til det helt oprindelige du spurgte om; hvis du
vil have en liste indeholdende alle terminaler hvadenten de virker eller
ej, så vil jeg anbefale dig at lade getcommand() returnere en fejl
(enten via. exception eller via. retur kode), og blot håndtere det - det
er da pænere end et explicit check for null m.v.  Det gør også at en
terminal kan fejle under kørsel, og blot opdatere sin interne status
alene (ingen grund til at modificere selve listen af terminaler).

Hvis du vil have en liste kun af terminaler der virker, så kan du gøre
noget i stil med det jeg skrev i sidste mail - men så skal du enten
acceptere at terminaler ikke må fejle under kørsel, eller lave noget
ekstra håndtering undervejs...

Jeg ved ikke hvad dine behov er, så jeg kan ikke gøre meget andet end at
smide et par forslag op i luften  :)

 / jakob



 
Home   Subscribe   Mail Archive   Index   Calendar   Search

 
 
Questions about the web-pages to <www_admin>. Last modified 2005-08-10, 22:43 CEST [an error occurred while processing this directive]
This page is maintained by [an error occurred while processing this directive]MHonArc [an error occurred while processing this directive] # [an error occurred while processing this directive] *