/ 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
statiske variable i nedarvede klasser
Fra : Jonas Meyer


Dato : 08-10-03 11:01

Hejsa.

Jeg har et problem med statiske member variable og nedarvning.

Jeg har en base klasse, der implementerer noget generel funktionalitet,
hvori der er brug for statiske variable.

class Base
{
static foo bar;
/// indsæt funktionalitet her.
};


Når mine to klasser A og B nedarver,
skal de have hver deres udgave af de statiske variable, fra Base.
Så hvis jeg skriver

class A : public Base{/*...*/};
class B : public Base{/*...*/};

så duer det ikke.

min nuværende løsning er et mindre hack - Base laves til en
template klasse der tager en int

template< int a >
class Base
{
static foo bar;
/// indsæt funktionalitet her.
};

så løses problemet med at sige

class A : public< 1 > { /*...*/ };
class B : public< 2 > { /*...*/ };

Men det virker ikke helt tilfredstillende - Det betyder at alle
der benytter Base, skal have en unikt heltal.
Den eneste måde jeg kan finde på der løser dette, er ved en headerfil
men en liste af konstanterne - ikke specielt pænt.

Såvidt jeg kan forstå, kan man ikke generere id'erne med templates, så
headerfilen er den eneste løsning

Jeg leder lidt efter en alternativ måde/ide til at løse problemet på,
hvorved jeg kan undgå afhængigheden af denne header fil.

mvh Jonas



 
 
Kasper Kristensen (08-10-2003)
Kommentar
Fra : Kasper Kristensen


Dato : 08-10-03 11:42


"Jonas Meyer" <someone@microsoft.com> wrote in message
news:bm0n1j$ms8$1@munin.diku.dk...
> Hejsa.
>
> Jeg har et problem med statiske member variable og nedarvning.
>
> Jeg har en base klasse, der implementerer noget generel funktionalitet,
> hvori der er brug for statiske variable.
>
> class Base
> {
> static foo bar;
> /// indsæt funktionalitet her.
> };
>
>
> Når mine to klasser A og B nedarver,
> skal de have hver deres udgave af de statiske variable, fra Base.
> Så hvis jeg skriver
>
> class A : public Base{/*...*/};
> class B : public Base{/*...*/};
>
> så duer det ikke.
>
>

Tror ikke det kan lade sig gøre. Jeg er ret sikker på at static variable
ikke bliver nedarvet.


Kasper



Mads Orbesen Troest (08-10-2003)
Kommentar
Fra : Mads Orbesen Troest


Dato : 08-10-03 11:49

On Wed, 8 Oct 2003 12:42:26 +0200, Kasper Kristensen wrote:

> Tror ikke det kan lade sig gøre. Jeg er ret sikker på at static variable
> ikke bliver nedarvet.

Adgangen til den statiske variabel "nedarves" naturligvis, men selvfølgelig
får man ikke en egen kopi af den, så var den jo ikke statisk!

Mvh,
/\/\\ads Orbesen Troest

Mads Orbesen Troest (08-10-2003)
Kommentar
Fra : Mads Orbesen Troest


Dato : 08-10-03 11:47

On Wed, 8 Oct 2003 12:01:03 +0200, Jonas Meyer wrote:

> Når mine to klasser A og B nedarver,
> skal de have hver deres udgave af de statiske variable, fra Base.

Hvad mener du - der er jo netop KUN en instans, den der ligger i Base, hvis
det er statiske variable du vil bruge. Ellers er det jo almindelige
instance-variable i Base du vil have - så får hver (instans af) dine
specialiseringer sin egen kopi.

/\/\\ads Orbesen Troest

Jonas Meyer (08-10-2003)
Kommentar
Fra : Jonas Meyer


Dato : 08-10-03 15:44


"Mads Orbesen Troest" <mads@troest.NEVERMORE.dk> wrote in message
news:nqtrntxi6aqy$.x6cvshewrxg8$.dlg@40tude.net...
> On Wed, 8 Oct 2003 12:01:03 +0200, Jonas Meyer wrote:
>
> > Når mine to klasser A og B nedarver,
> > skal de have hver deres udgave af de statiske variable, fra Base.
>
> Hvad mener du - der er jo netop KUN en instans, den der ligger i Base,
hvis
> det er statiske variable du vil bruge. Ellers er det jo almindelige
> instance-variable i Base du vil have - så får hver (instans af) dine
> specialiseringer sin egen kopi.

Jeg skal bruge et sæt af de statiske variable, for hver klasse
der nedarver fra Base klassen. Det var også det min eksempel
gjorde(om end på en grim måde).

Jonas



Igor V. Rafienko (08-10-2003)
Kommentar
Fra : Igor V. Rafienko


Dato : 08-10-03 11:55

[ Jonas Meyer ]

[ ... ]

> Jeg leder lidt efter en alternativ måde/ide til at løse problemet
> på, hvorved jeg kan undgå afhængigheden af denne header fil.


Definere egen statisk variabel for hver klasse?





ivr
--
<html><form><input type crash></form></html>

Jonas Meyer (08-10-2003)
Kommentar
Fra : Jonas Meyer


Dato : 08-10-03 15:45

"Igor V. Rafienko" <igorr@ifi.uio.no> wrote in message
news:xjvu16kyp5q.fsf@cormons.ifi.uio.no...
> Definere egen statisk variabel for hver klasse?

De statiske variable bliver brugt i Base klassen, så jeg
kan ikke helt se hvordan det skal lade sig gøre?

Jonas



Kent Friis (08-10-2003)
Kommentar
Fra : Kent Friis


Dato : 08-10-03 15:55

Den Wed, 8 Oct 2003 16:44:41 +0200 skrev Jonas Meyer:
>"Igor V. Rafienko" <igorr@ifi.uio.no> wrote in message
>news:xjvu16kyp5q.fsf@cormons.ifi.uio.no...
>> Definere egen statisk variabel for hver klasse?
>
>De statiske variable bliver brugt i Base klassen, så jeg
>kan ikke helt se hvordan det skal lade sig gøre?

get() og set() funktioner?

Mvh
Kent
--
Journalist: En der har forstand på at skrive artikler, men typisk
ikke på det artiklerne handler om.

Igor V. Rafienko (08-10-2003)
Kommentar
Fra : Igor V. Rafienko


Dato : 08-10-03 16:50

[ Jonas Meyer ]

[ ... ]


> De statiske variable bliver brugt i Base klassen, så jeg kan ikke
> helt se hvordan det skal lade sig gøre?


Hvilket problem er det du egentlig forsøker å løse?





ivr
--
<html><form><input type crash></form></html>

Jonas Meyer (09-10-2003)
Kommentar
Fra : Jonas Meyer


Dato : 09-10-03 09:57

"Igor V. Rafienko" <igorr@ifi.uio.no> wrote in message
news:xjvn0cbzq2z.fsf@cormons.ifi.uio.no...
> Hvilket problem er det du egentlig forsøker å løse?

Base klassen skal kunne ændre i member variable i den nedarvede klasse
via pointer til member variable. Ved at underklassen registrerer nogen
egenskaber ved en pointer/string par, kan jeg lave io'en for alle nedarvede
klasser et sted.

Jonas



Anders J. Munch (08-10-2003)
Kommentar
Fra : Anders J. Munch


Dato : 08-10-03 14:31

"Jonas Meyer" <someone@microsoft.com> wrote in message
news:bm0n1j$ms8$1@munin.diku.dk...

Hvorfor poster en M$-medarbejder fra en DIKU-server? Eller er du bare
ikke bekendt med .invalid TLDen.

>
> class A : public< 1 > { /*...*/ };
> class B : public< 2 > { /*...*/ };
>
> Men det virker ikke helt tilfredstillende - Det betyder at alle
> der benytter Base, skal have en unikt heltal.

class A : public Base<A> { /*...*/ };
class B : public Base<B> { /*...*/ };

Kaldes curiously recurring template mønstret.

mvh. Anders



Jonas Meyer (08-10-2003)
Kommentar
Fra : Jonas Meyer


Dato : 08-10-03 15:48

"Anders J. Munch" <andersjm@dancontrol.dk> wrote in message
news:3f841211$0$54849$edfadb0f@dread11.news.tele.dk...
> "Jonas Meyer" <someone@microsoft.com> wrote in message
> news:bm0n1j$ms8$1@munin.diku.dk...
>
> Hvorfor poster en M$-medarbejder fra en DIKU-server? Eller er du bare
> ikke bekendt med .invalid TLDen.

Nej.

> > class A : public< 1 > { /*...*/ };
> > class B : public< 2 > { /*...*/ };
> >
> > Men det virker ikke helt tilfredstillende - Det betyder at alle
> > der benytter Base, skal have en unikt heltal.
>
> class A : public Base<A> { /*...*/ };
> class B : public Base<B> { /*...*/ };
>
> Kaldes curiously recurring template mønstret.

Perfekt.
Det giver selvf. mening, og løser problemet - Er der mere i mønstret? min
søgning giver en reference på citeseer, til en artikel i
C++ report. Står der noget om det, online, nogen steder?

Jonas



Mogens Hansen (08-10-2003)
Kommentar
Fra : Mogens Hansen


Dato : 08-10-03 16:25


"Jonas Meyer" <a@b.c> wrote

[8<8<8<]
> Det giver selvf. mening, og løser problemet - Er der mere i mønstret? min
> søgning giver en reference på citeseer, til en artikel i
> C++ report. Står der noget om det, online, nogen steder?

Artikel:
Curiously recurring template pattern
Jim Coplien
C++ Report, February 1995, Vol. 7 No. 2

Men også bogen
Multi-Paradigm DESIGN for C++
James O. Coplien
ISBN 0-201-82467-1
indeholder meget mere af samme skuffe.
Den er ikke specielt nem at komme i gang med, men meget givende når man har
taget tilløbet til at komme igennem - men sådan er Coplien's arbejder ofte.

Mon ikke også man kan finde noget via Google ?

Venlig hilsen

Mogens Hansen



Anders J. Munch (08-10-2003)
Kommentar
Fra : Anders J. Munch


Dato : 08-10-03 16:38

"Jonas Meyer" <a@b.c> wrote in message news:bm17sa$6d4$1@munin.diku.dk...
> > class A : public Base<A> { /*...*/ };
> > class B : public Base<B> { /*...*/ };
> >
> > Kaldes curiously recurring template mønstret.
>
> Perfekt.
> Det giver selvf. mening, og løser problemet - Er der mere i mønstret?

Ikke rigtigt - det er en løsning uden et klart defineret problem. En
(sjælden) gang imellem støder man ind i et problem hvor det er
praktisk hvis overklassen har adgang til information om underklassen,
herunder specielt dens type, og så kan mønstret bruges. Det giver en
mixin-agtig nedarvningsstil. "Mixin inheritance" skulle være til at
søge på. Progammeringssproget Flavors (en Lisp overbygning) er den
kanoniske repræsentant for denne stil.

mvh. Anders



Mogens Hansen (08-10-2003)
Kommentar
Fra : Mogens Hansen


Dato : 08-10-03 18:20


"Jonas Meyer" <a@b.c> wrote

[8<8<8<]
> Er der mere i mønstret?

Brugen af curiously recurring template pattern med en static i template
basisklassen er også beskrevet i den glimrende bog
C++ Templates, The Complete Guide
Daveed Vandevoorde, Nicolai M. Josuttis
ISBN 0-201-73484-2


Men en mere spændende indgangsvinkel er som alternativ til anvendelse af
virtuelle metoder.
Virtuelle metoder giver run-time polymorfi.
Templates giver compile-time polymorfi, og curiously recurring template
pattern er et forholdsvis simpelt alternativ til virtuelle metoder.

Det kan nemt illustreres med "Template Method" design patternet (fra GoF),
som er beskrevet run-time polymorfisk.

<Run-time polymorfi>
class abstract_base
{
public:
void template_method()
{
primitive_operation_1();
primitive_operation_2();
primitive_operation_3();
}

private:
virtual void primitive_operation_1() = 0;
virtual void primitive_operation_2() = 0;
virtual void primitive_operation_3() = 0;
};

class concrete_class : public abstract_base
{
private:
virtual void primitive_operation_1();
virtual void primitive_operation_2();
virtual void primitive_operation_3();
};

int main()
{
concrete_class cc;
cc.template_method();
}

<Run-time polymorfi/>

<Compile-time polymorfi>
template <typename concrete_derived>
class abstract_base
{
public:
void template_method()
{
static_cast<concrete_derived*>(this)->primitive_operation_1();
static_cast<concrete_derived*>(this)->primitive_operation_2();
static_cast<concrete_derived*>(this)->primitive_operation_3();
}
};

class concrete_class : public abstract_base<concrete_class>
{
private:
friend abstract_base<concrete_class>;
void primitive_operation_1()
{ }
void primitive_operation_2()
{ }
void primitive_operation_3()
{ }
};

int main()
{
concrete_class cc;
cc.template_method();
}

<Compile-time polymorfi/>

Bemærk at compile-time polymorfi giver mulighed for optimal performance med
inlining af funktionerne, og samtidig udtrykker det meget klart bindings
tidspunktet for den tilladelige varians.

Venlig hilsen

Mogens Hansen



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

Månedens bedste
Årets bedste
Sidste års bedste