| 
					
							
        
    
        
						
			 | 
			
			
					    
					
        
         
          
         
	
            | initialisering af const i c++ Fra : Dennis | 
  Dato :  05-08-05 16:25 |  
  |   
            Hej
 
 Når man initialiserer en const i en class kan man så ikke benytte utility
 func. til at sikre værdien af god nok. I nedenstående eksempel har har en
 begrænsning mellem 0-9, hvordan sikrer jeg at objektet ikke instantieres med
 en værdi  udover intervallet på variablen b?
 
 På forhånd tak, Dennis
 
 class ClsWConst {
 public:
     ClsWConst( int ai = 0, int bi = 0 );
 private:
     int limit( int );
     int a;
     const int b;
 };
 
 ClsWConst::ClsWConst( int ai, int bi )
     : b( bi )
 {
     a = limit( ai );
 }
 
 int ClsWConst::limit( int numb )
 {
     if(numb >= 9) numb = 9;
     else if(numb <= 0) numb = 0;
     return numb;
 }
 
 
  
            
             |   |   
            
        
 
            
         
           Mogens Hansen (05-08-2005) 
         
	
            | Kommentar Fra : Mogens Hansen | 
  Dato :  05-08-05 16:31 |  
  |   
            
 "Dennis" <dennis_tolstrup@hotmail.com> wrote in message 
 news:42f384c8$0$75046$edfadb0f@dread14.news.tele.dk...
 > Hej
 >
 > Når man initialiserer en const i en class kan man så ikke benytte utility
 > func. til at sikre værdien af god nok. I nedenstående eksempel har har en
 > begrænsning mellem 0-9, hvordan sikrer jeg at objektet ikke instantieres 
 > med
 > en værdi  udover intervallet på variablen b?
 
 Jo.
 
 
 [8<8<8<]
 > ClsWConst::ClsWConst( int ai, int bi )
 >    : b( bi )
 
    : b(limit(bi))
 
 (Der kommer en lidt mere radikal løsning om lidt)
 
 [8<8<8<]
 > int ClsWConst::limit( int numb )
 
 Er der nogen grund det at det er en member-funktion ?
 Den bruger jo ikke noget state.
 
 Venlig hilsen
 
 Mogens Hansen 
 
 
  
            
             |   |   
            
        
 
            
         
           Mogens Hansen (05-08-2005) 
         
	
            | Kommentar Fra : Mogens Hansen | 
  Dato :  05-08-05 16:52 |  
  |   
            
 "Mogens Hansen" <mogens_h@dk-online.dk> wrote in message 
 news:42f3864f$0$67261$157c6196@dreader2.cybercity.dk...
 
 [8<8<8<]
 > (Der kommer en lidt mere radikal løsning om lidt)
 
 Klassen "limit" sikrer at constructoren til "foo", hvis den ikke kaldes med 
 en parameter der ligger inden for det lovlige interval.
 Man kan så direkte se begrænsningen af interfacet til "foo" og man kan bruge 
 klassen som parameter til alle funktioner, uden at der kommer noget 
 overhead.
 Den kunne også skrives så den begrænses til at være lovlig, på samme måde 
 som i det oprindelige eksempel.
 
 #include <stdexcept>
 
 template <int min, int max>
 class limit
 {
 public:
    limit(int value) :
       value_(value)
        {
          if(value_ >= max)
             throw std::out_of_range("to large");
          if(value <= min)
             throw std::out_of_range("to small");
        }
 
    operator int () const
       {  return value_; }
 
 private:
    const int   value_;
 };
 
 
 class foo
 {
 public:
    foo(limit<0, 9> value) :
       value_(value)
    {
    }
 
 private:
    const int      value_;
 };
 
 int main()
 {
    foo   f1(1);   // OK
    foo   f10(10); // throw
    foo   f_1(-1); // throw
 } 
 
 
  
            
             |   |   
            
        
 
            
         
            Soren Holstebroe (08-08-2005) 
         
	
            | Kommentar Fra : Soren Holstebroe | 
  Dato :  08-08-05 12:21 |  
  |   
            Mogens Hansen wrote:
 
 > Klassen "limit" sikrer at constructoren til "foo", hvis den ikke kaldes
 > med en parameter der ligger inden for det lovlige interval.
 > Man kan så direkte se begrænsningen af interfacet til "foo" og man kan
 > bruge klassen som parameter til alle funktioner, uden at der kommer noget
 > overhead.
 > Den kunne også skrives så den begrænses til at være lovlig, på samme måde
 > som i det oprindelige eksempel.
 
 Det virker drastisk, at pakke din int ind i en klasse. Jeg synes det er
 svært at læse. Jeg ville nok foretrække en simpel funktion ala:
 
 ---------------------------------------------------------------------------
 #include <stdexcept>
 #include <iostream>
 
 
 template <int min, int max>
 inline int checkLimit(int &value) {
    if(value > max)   throw std::out_of_range("too large");
    if(value < min)   throw std::out_of_range("too small");
    return value;
 }
 
 template <int min, int max>
 inline int limit(int &value) {
    return (value < min) ? min :
           (value > max) ? max :
           value;
 }
 
 class foo
 {
 public:
    foo(int value) :
       value_(checkLimit<0,9>(value))
    {
    }
 
 private:
    const int      value_;
 };
 
 int main()
 {
         try {
            foo   f1(1);   // OK
            foo   f10(10); // throw
            foo   f_1(-1); // throw
         } catch (std::exception &e) {
                 std::cerr << e.what() << std::endl;
         }
 }
 ------------------------------------------------------------
 
 Evt. kan int-typen også gøres generisk.
 
 Søren
  
            
             |   |   
            
        
 
            
         
             Mogens Hansen (08-08-2005) 
         
	
            | Kommentar Fra : Mogens Hansen | 
  Dato :  08-08-05 18:15 |  
  |   
            
 "Soren Holstebroe" <mailsoren@medgen.ku.dk> wrote in message 
 news:dd7f6h$qbu$1@news.net.uni-c.dk...
 
 [8<8<8<]
 > Det virker drastisk, at pakke din int ind i en klasse. Jeg synes det er
 > svært at læse.
 
 Brugen af en klasse og en funktion er ikke ækvivalente.
 
 Brugen af klassen giver 2 fordele:
   * Kriterierne evalueres _inden_ constructoren kaldes
   * Man kan se kriterierne direkte af funktionens signatur
 
 Venlig hilsen
 
 Mogens Hansen 
 
 
  
            
             |   |   
            
        
 
    
 
					
					 
			 | 
			
				
        
			 |