/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
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



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste