/ 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
Bech_bb 500
kyllekylle 500
jdjespers.. 500
gibson 300
scootergr.. 300
molokyle 287
10  strarup 270
Konv et C prg til at udnytte Class i Cpp
Fra : Allan S. Olsen


Dato : 25-11-09 20:50

Hej gruppe.

Jeg har lavet noget i C som jeg spekulere på om man med fordel kunne lave om
til Cpp.
Sagt på en anden måde: I C har jeg en masse struct's som bliver kædet sammen
med andre struct's etc.
Nu ligger det jo ligefor at bruge class istedet.
Men pga måden jeg har bygget det op på, så har jeg lavet 3 dele hvor:
1 er standard deklareringer af typer etc.
2 er så alle 'data' typer og rutiner (funktioner).
3 er føde-data og her har jeg ikke mindre end 3 'arvinger' af fil 2's typer.

I fil 3 opretter jeg en række const og det er så her filmen knækker.
Hvordan gør man det med class's ?

Herunder hvordan det er lavet i C i meget korte træk. Meget er fjernet men
nok er tilbage til forståelse for problemet.
Det der er mest interessant er linien i fil 2: struct io_Inp const *Stl;
Som bliver sat i fil 3.

Har en eller anden idé om at man ved at opbygge en class' gør noget i stil
af:
class bssek BsGrSek={FALSK, &BsGrSek00, &BsGrSekBit00};

Problemet er bare at bssek er en meget lille del af en ret stor struct som
indeholder mange andre struct, hvor jeg har behov for at initialisere alle
"externt" fra, da en datafil for hver kopi af hoved 'struct'en indeholder
alle data for denne ene kopi. Og de fleste data SKAL være konstanter.

Sort snak ?
Spørg frem hvis mere info ønskes.

Her lidt snips fra originale C program.

Mvh. Allan

--- h.fil 1 ---
typedef unsigned char UBYTE;
enum {FALSK=0,SAND};

struct io_Inp
{
UBYTE Indg;
};

struct iobit
{
UBYTE Gl;
UBYTE Ny;
};

---h.fil 2 ---
struct bssek
{
UBYTE Besat;
struct io_Inp const *Stl;
struct iobit *Bit;
};


---h.fil 3 ---
struct io_Inp const BsGrSek00={48};
struct iobit BsGrSekBit00={0, 0};

struct bssek BsGrSek[BsGrSekAnt]=
{
{FALSK, &BsGrSek00, &BsGrSekBit00}
};




 
 
Mogens Hansen (26-11-2009)
Kommentar
Fra : Mogens Hansen


Dato : 26-11-09 09:12


"Allan S. Olsen" <nuller@goj.net> wrote in message
news:4b0d8aa6$0$36563$edfadb0f@dtext01.news.tele.dk...
> Hej gruppe.
>
> Jeg har lavet noget i C som jeg spekulere på om man med fordel kunne lave
> om til Cpp.
> Sagt på en anden måde: I C har jeg en masse struct's som bliver kædet
> sammen med andre struct's etc.
> Nu ligger det jo ligefor at bruge class istedet.

I C++ er der ingen forskel på struct og class, bortset fra medlemmer i en
struct er public som default, mens de er privat som default i en class.

> Men pga måden jeg har bygget det op på, så har jeg lavet 3 dele hvor:
> 1 er standard deklareringer af typer etc.
> 2 er så alle 'data' typer og rutiner (funktioner).
> 3 er føde-data og her har jeg ikke mindre end 3 'arvinger' af fil 2's
> typer.
>
> I fil 3 opretter jeg en række const og det er så her filmen knækker.
> Hvordan gør man det med class's ?
>
> Herunder hvordan det er lavet i C i meget korte træk. Meget er fjernet men
> nok er tilbage til forståelse for problemet.
> Det der er mest interessant er linien i fil 2: struct io_Inp const *Stl;
> Som bliver sat i fil 3.
>
> Har en eller anden idé om at man ved at opbygge en class' gør noget i stil
> af:
> class bssek BsGrSek={FALSK, &BsGrSek00, &BsGrSekBit00};
>
> Problemet er bare at bssek er en meget lille del af en ret stor struct som
> indeholder mange andre struct, hvor jeg har behov for at initialisere alle
> "externt" fra, da en datafil for hver kopi af hoved 'struct'en indeholder
> alle data for denne ene kopi. Og de fleste data SKAL være konstanter.

Hvis det skal være _meget_ const kan man overveje at benytte templates og
konstanterne som template parametre. Det giver mulighed for yderligere
compiler-optimeringer.

>
> Sort snak ?
> Spørg frem hvis mere info ønskes.
>
> Her lidt snips fra originale C program.
>
> Mvh. Allan
>
> --- h.fil 1 ---
> typedef unsigned char UBYTE;

Giver den typedef nogen reel værdi ?

> enum {FALSK=0,SAND};

Generelt mener jeg at det er upraktisk at bruge dansk som navne i i C eller
C++ program. Alle keywords er på engelsk, så kan klasser, funktioner,
variable osv. også lige så godt være det.

Iøvrigt har C++ en indbygget "bool" type, der kan antage værdierne "true" og
"false"
C99 har noget tilsvarende - men ikke identisk

>
> struct io_Inp
> {
> UBYTE Indg;
> };

Du kan sikre at instanser af denne type bliver konstant og initialiseret ved
at skrive (jeg har ikke oversat koden):

class io_inp
{
public:
// constructor
io_inp(unsigned char inp_arg) :
inp(inp_arg) {}

// access method
unsigned char inp() const
{ return inp_; }

private:
const unsigned char inp_;
};

>
> struct iobit
> {
> UBYTE Gl;
> UBYTE Ny;
> };

og tilsvarende

struct iobit
{
public:
// constructor
iobit(unsigned char prev_value_arg, unsigned char new_value_arg) :
prev_value_(prev_value_arg), new_value_(new_value_arg) {}

// access methods
unsigned char prev_value() const
{ return prev_value_; }
unsigned char new_value() const
{ return new_value_; }

private:
unsigned char prev_value_;
unsigned char new_value_;
};

>
> ---h.fil 2 ---
> struct bssek
> {
> UBYTE Besat;
> struct io_Inp const *Stl;
> struct iobit *Bit;
> };

Ved at bruge reference (&) i stedet for pointer (*), tvinger man brugeren af
typen til at sikre at objektet findes - den kan ikke være 0.

struct bssek
{
public:
// constructor
bssek(bool used_arg, const io_inp& stl_arg, const iobit& bit_arg) :
used_(used_arg), stl_(stl_arg), bit_(bit_arg) {}

// access methods
bool used() const
{ return used_; }
const io_inp& stl() const
{ return stl_; }
const iobit& bit() const
{ return bit_; }

private:
const bool used_;
const io_inp& stl_;
const iobit& bit_;
};

>
>
> ---h.fil 3 ---
> struct io_Inp const BsGrSek00={48};

const io_inp[] =
{ ip_inp(48) };

> struct iobit BsGrSekBit00={0, 0};

const bs_gr_sek_bit00(0, 0);

>
> struct bssek BsGrSek[BsGrSekAnt]=
> {
> {FALSK, &BsGrSek00, &BsGrSekBit00}
> };

const bssek bs_gr_sek[] =
{ bssek(false, bs_gr_sek_bit00, bs_gr_sek_bit00) };


Du får bedre indkapsling og sikring af at objekterne er const, uden det
kommer til at fylde mere eller køre langsommere.

Er det noget i den stil du efterspørger ?

--
Venlig hilsen

Mogens Hansen



Allan S. Olsen (29-11-2009)
Kommentar
Fra : Allan S. Olsen


Dato : 29-11-09 14:50


> Hvis det skal være _meget_ const kan man overveje at benytte templates og
> konstanterne som template parametre. Det giver mulighed for yderligere
> compiler-optimeringer.
>

Hm, har fundet nogle af mine Cpp bøger frem igen.
Som gammel C mand, er der stadig mange nye begreber at lære i Cpp.
Template er een af dem.
Tænkte ellers, at starte på at ændre et eksisterende C progran, ville være
en udemærket læremetode.
Nå, men bøgerne er fundet frem igen og projektet er sat lidt i bero.

>
> Giver den typedef nogen reel værdi ?
>
>> enum {FALSK=0,SAND};

Tja, det er vel en smagsag og jeg kan sagtens følge dig.
Men har man først fået unoder, er de svære at fjerne igen. Sorry....

> struct iobit
> {
> public:
> // constructor
> iobit(unsigned char prev_value_arg, unsigned char new_value_arg) :
> prev_value_(prev_value_arg), new_value_(new_value_arg) {}
>
> // access methods
> unsigned char prev_value() const
> { return prev_value_; }
> unsigned char new_value() const
> { return new_value_; }

Læser jeg korrekt ?
prev_value() returnere en const men selve prev_value_ er ikke en const ?
Hvis det er sådan, så er det udemærket for denne type, da prev_value_ og
new_value_ ændres løbende i programmet men ikke må kunne ændres andre steder
fra.


> Ved at bruge reference (&) i stedet for pointer (*), tvinger man brugeren
> af typen til at sikre at objektet findes - den kan ikke være 0.

Det vil jeg tage til efterretning. Endnu een af Cpp's stærke sider.


> Du får bedre indkapsling og sikring af at objekterne er const, uden det
> kommer til at fylde mere eller køre langsommere.
>
> Er det noget i den stil du efterspørger ?
>

Tja, det er svært at overskue med min ringe Cpp viden, men du har sat mange
tanker i gang.
Er dybt imporneret over din professionelle måde at analysere ting på.

Tak indtil videre.

Allan



Mogens Hansen (29-11-2009)
Kommentar
Fra : Mogens Hansen


Dato : 29-11-09 17:16


"Allan S. Olsen" <nuller@goj.net> wrote in message
news:4b127bf0$0$36560$edfadb0f@dtext01.news.tele.dk...

[8<8<8<]
> Hm, har fundet nogle af mine Cpp bøger frem igen.
> Som gammel C mand, er der stadig mange nye begreber at lære i Cpp.

Jeg kan varmt anbefale bogen
Accelerated C++
Andrew Koenig and Barbara E. Moo
ISBN 0-201-70353-X

> Template er een af dem.

Det er på mange måder en utrolig kraftfuld ting.


[8<8<8<]
> Tja, det er vel en smagsag og jeg kan sagtens følge dig.
> Men har man først fået unoder, er de svære at fjerne igen.

Det var ikke enum'en men
typedef unsigned char UBYTE;
jeg mener ikke gavner.

[8<8<8<]
> Læser jeg korrekt ?
> prev_value() returnere en const men selve prev_value_ er ikke en const ?

Nej.
Det const, der står efter metoden angiver at kald af metoden ikke kan ændre
objektets værdi.
Det betyder at hvis man har en const pointer til sådan et objekt, kan man
stadig (og kun) kalde "const" member-metoder.


--
Venlig hilsen

Mogens Hansen



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

Månedens bedste
Årets bedste
Sidste års bedste