|
| 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
| |
|
|