/ 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
Overloadet = for klasse, men har satdig pr~
Fra : Thomas de Silva


Dato : 25-09-02 10:41

Jeg har overloadet =int for en klasse, så keg kan gøre dette
MinKlasse=45
Klassens constructor tager en værdi, så constructoren er af formen
CMinKlasse MitObjekt(56);
Imidlertid kan jeg ikke gøre sådan her
CMinKlasse MitObjekt(56)=78;

Hvordan kan det være?
Compileren giver en "decleration syntax error"




 
 
Ivan Johansen (25-09-2002)
Kommentar
Fra : Ivan Johansen


Dato : 25-09-02 12:19

"Thomas de Silva" <alamyx@softhome.netSPAM> wrote in message
news:ams0ar$2730$1@news.cybercity.dk...
> Jeg har overloadet =int for en klasse, så keg kan gøre dette
> MinKlasse=45
> Klassens constructor tager en værdi, så constructoren er af formen
> CMinKlasse MitObjekt(56);
> Imidlertid kan jeg ikke gøre sådan her
> CMinKlasse MitObjekt(56)=78;
>
> Hvordan kan det være?
> Compileren giver en "decleration syntax error"

Compileren har ret. Det er ikke gyldigt. Prøv at tænke på hvordan du ville
gøre med en int:
int x(56)=78;

Dette virker heller ikke.
Hvad er det egentligt du forsøger på?

Ivan Johansen



Thomas de Silva (25-09-2002)
Kommentar
Fra : Thomas de Silva


Dato : 25-09-02 15:23

> Hvad er det egentligt du forsøger på?

Jeg forsøger at lave min klasse og i samme hug sætte en værdi for den.
= er overloaded for int. Klassen tager en int param når den oprettes. Denne
værdi er antallet af bits i min datatype.

Ville gøre det samme som
MinKlasse Objekt(128);
Objekt=34;

Mente jo at Objekt(128) ville svare til Objekt i den næste linie, så man
kunne skrive det som eet.
Ikke fordi det er et spørgsmål om liv og død.. jeg ønskede bare at gøre
sådan.




Bertel Lund Hansen (25-09-2002)
Kommentar
Fra : Bertel Lund Hansen


Dato : 25-09-02 15:58

Thomas de Silva skrev:

>Ville gøre det samme som
>MinKlasse Objekt(128);
>Objekt=34;

Hvad med:   MinKlasse Objekt(34); ?

(med forbehold for hvad det egentlig udfører ...)

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

Thomas de Silva (25-09-2002)
Kommentar
Fra : Thomas de Silva


Dato : 25-09-02 16:18

> Hvad med: MinKlasse Objekt(34); ?

"Klassen tager en int param når den oprettes. Denne værdi er antallet af
bits i min datatype"

Det er en x size integer klasse. Creates med antal bits. Ex MinKlasse(32) er
egentlig bare et dword.
MinKlasse=int vil sætte int værdien ind i min klasse. Det virker fint nok
også.

Dette laver en var på 128 bit og sætter den så til værdien 45:
HugeInt Test(128);
Test=45;

Jeg forventede bare at jeg kunne gøre det i _et_ ryk
HugeInt Test(128)=45;







Ivan Johansen (25-09-2002)
Kommentar
Fra : Ivan Johansen


Dato : 25-09-02 21:59

Thomas de Silva wrote:
> Dette laver en var på 128 bit og sætter den så til værdien 45:
> HugeInt Test(128);
> Test=45;
>
> Jeg forventede bare at jeg kunne gøre det i _et_ ryk
> HugeInt Test(128)=45;

Det du i virkeligheden vil er at initialisere objektet med to værdier:
class CMinKlasse
{
public:
CMinKlasse(int Bits, int Value);
};

Du opretter så instanser således:
CMinKlasse MitObjekt(128, 45);


Ivan Johansen


Thomas de Silva (26-09-2002)
Kommentar
Fra : Thomas de Silva


Dato : 26-09-02 05:49

> Du opretter så instanser således:
> CMinKlasse MitObjekt(128, 45);

Men jeg ønsker jo at anvende den overloadede =operator og ikke
parantes-notation.
Klassen skal jo tilgås som en normal variabel, så det er usynligt at det er
en klasse.



Ivan Johansen (26-09-2002)
Kommentar
Fra : Ivan Johansen


Dato : 26-09-02 12:00

"Thomas de Silva" <alamyx@softhome.netSPAM> wrote in message
news:amu3jg$1g0s$1@news.cybercity.dk...
> Men jeg ønsker jo at anvende den overloadede =operator og ikke
> parantes-notation.
> Klassen skal jo tilgås som en normal variabel, så det er usynligt at det
er
> en klasse.

Man bruger en constructor til initialisering. operator=() bruges til
tildeling:
int x(5); //x oprettes og initialiseres til 5
x = 25; //x tildeles nu værdien 25

CMinKlasse MitObjekt(128,45); //MitObjekt initialiseres med 128 og 45
MitObjekt = 78; //MitObjekt tildeles værdien 78

De to værdier (128 og 45) er begge værdier som objektet initialiseres med,
og de kan i princippet begge ændres under kørslen. Du har bare valgt at den
ene værdi kan ændres af operator=().

Det kunne lyde som om at det i virkeligheden er en template klasse du er
interesseret i, da du betragter bitstørrelsen som konstant:
template<int Bits> CMinKlasse
{
public:
CMinKlasse(int Value);
};

CMinKlasse<128> MitObjekt = 45;

Ivan Johansen



Thomas de Silva (26-09-2002)
Kommentar
Fra : Thomas de Silva


Dato : 26-09-02 12:35

> De to værdier (128 og 45) er begge værdier som objektet initialiseres med,
> og de kan i princippet begge ændres under kørslen. Du har bare valgt at
den
> ene værdi kan ændres af operator=().

Takker for svaret, men det hele bunder i at jeg forventede (siger ikke jeg
har BRUG for) at kunne lave og bruge mit objekt i et hug.

> Det kunne lyde som om at det i virkeligheden er en template klasse du er
> interesseret i, da du betragter bitstørrelsen som konstant:

Ja, det kunne lyde sådan, men det vil ikke være ønskeligt, da det er mindre
konstant end som så. Mine klasser kan ændre bitstørelse efter compile.



Anders Melchiorsen (26-09-2002)
Kommentar
Fra : Anders Melchiorsen


Dato : 26-09-02 15:29

"Ivan Johansen" <NG@Padowan.dk> skrev:

> Man bruger en constructor til initialisering. operator=() bruges til
> tildeling:
> int x(5); //x oprettes og initialiseres til 5
> x = 25; //x tildeles nu værdien 25

Jeg har ikke fulgt tråden nøje, men det forekommer mig at det følgende
ikke er blevet nævnt tydeligt endnu:

Hvis man bruger = i en erklæring betyder det "copy
constructor", ikke "assignment".

Det er vist dét, misforståelsen bygger på.


Det oprindelige eksempel,

CMinKlasse MitObjekt(56)=78;

skulle derfor, hvis det var lovligt, betyde

CMinKlasse MitObjekt(56) = CMinKlasse(78);

og MitObjekt skulle derfor først konstrueres ved hjælp af
CMinKlasse(int) constructoren og derefter ved hjælp af en copy
constructor. Så var MitObjekt blevet konstrueret to gange, og det kan
vi ikke have!


Anders
(som håber at han ikke fik det simplificeret så meget, at det blev forkert)
--
Min adresse er gyldig i en uge.
Derefter skal (kun) delen '.dJJJ-YY' fjernes.

Thomas de Silva (26-09-2002)
Kommentar
Fra : Thomas de Silva


Dato : 26-09-02 15:35

> Hvis man bruger = i en erklæring betyder det "copy
> constructor", ikke "assignment".

Afhænger nu af om = operatoren er overloadet, hvilket den er.
En copyconstructor der kopierer 78 over i en klasse giver ikke meget mening.

> Det er vist dét, misforståelsen bygger på.
>
>
> Det oprindelige eksempel,
>
> CMinKlasse MitObjekt(56)=78;
>
> skulle derfor, hvis det var lovligt, betyde
>
> CMinKlasse MitObjekt(56) = CMinKlasse(78);

Nej, CMinKlasse MitObjekt(56)=78; skulle betyde
CMinKlasse MitObjekt(56) tildeles nu værdien 78 gennem =-operatoren.




Ivan Johansen (26-09-2002)
Kommentar
Fra : Ivan Johansen


Dato : 26-09-02 19:35

Thomas de Silva wrote:
>> Hvis man bruger = i en erklæring betyder det "copy
>> constructor", ikke "assignment".
> Afhænger nu af om = operatoren er overloadet, hvilket den er.
> En copyconstructor der kopierer 78 over i en klasse giver ikke meget mening.

Nej, følgende to ligner opfattes ens af compileren:
int x = 5;
int x(int(5));

Det samme gælder for dit objekt:
CMinKlasse MitObjekt = 56;
CMinKlasse MitObjekt = CMinKlasse(56);

Det er dog tilladt compileren at optimere denne copy constructor væk, så
det bliver:
CMinKlasse MitObjekt(56);

Dette kræver dog at copy constructoren stadig er tilgængelig og ikke
erklæret private.

> Nej, CMinKlasse MitObjekt(56)=78; skulle betyde
> CMinKlasse MitObjekt(56) tildeles nu værdien 78 gennem =-operatoren.

Nej, sådan fungerer C++ ikke.

Ivan Johansen


Thomas de Silva (26-09-2002)
Kommentar
Fra : Thomas de Silva


Dato : 26-09-02 21:43

> > Nej, CMinKlasse MitObjekt(56)=78; skulle betyde
> > CMinKlasse MitObjekt(56) tildeles nu værdien 78 gennem =-operatoren.
>
> Nej, sådan fungerer C++ ikke.

Nej, det har jeg nu forstået. Det var sådan set bare det



Byrial Jensen (26-09-2002)
Kommentar
Fra : Byrial Jensen


Dato : 26-09-02 19:20

Thomas de Silva <alamyx@softhome.netSPAM> skrev:

> "Klassen tager en int param når den oprettes. Denne værdi er antallet af
> bits i min datatype"
>
> Dette laver en var på 128 bit og sætter den så til værdien 45:
> HugeInt Test(128);
> Test=45;
>
> Jeg forventede bare at jeg kunne gøre det i _et_ ryk
> HugeInt Test(128)=45;

Du kunne gøre på en gang ved at lave en constructor som kan tage 2
argumenter:

class HugeInt
{
public:
HugeInt (unsigned size_in_bits, long value = 0);
....
}

HugeInt Test (128, 45); // 128 bit integer with the value 45
HugeInt Test2 (128); // 128 bit integer with the value 0 (default)

Thomas de Silva (26-09-2002)
Kommentar
Fra : Thomas de Silva


Dato : 26-09-02 21:48

> Du kunne gøre på en gang ved at lave en constructor som kan tage 2
> argumenter:

Det var ikke fordi det var vigtigt at sætte værdien samtidigt.
Det var udelukkende et spørgsmål om pæn notation.
For mig virker det lige så godt med
klassetype objekt(23);
objekt=45;

Jeg undrede mig bare over at man ikke kunne
klassetype objekt(23)=25;
da jeg mente "klassetype objekt(23)" var at betragte som et objekt og da jeg
havde lavet en = operator for objekt, mente jeg at det ville svare til
objekt=25;

på samme måde som at "klasse+klasse" kan betragtes som "resultat"
så man godt kan skrive (klasse+klasse).metode ol.

Anyway det var bare det.



Bjarke Dahl Ebert (27-09-2002)
Kommentar
Fra : Bjarke Dahl Ebert


Dato : 27-09-02 22:56

"Thomas de Silva" <alamyx@softhome.netSPAM> wrote in message
news:amsk2q$2s0p$1@news.cybercity.dk...

> Det er en x size integer klasse. Creates med antal bits. Ex MinKlasse(32)
er
> egentlig bare et dword.
> MinKlasse=int vil sætte int værdien ind i min klasse. Det virker fint nok
> også.

Du kan jo eventuelt lade størrelsen variere dynamisk.
Hvis størrelsen endelig skal kendes på oprettelsestidspunktet, er det nok
bedst at erklære constructor'en explicit:

class MinKlasse
{
public:
// ...
explicit MinKlasse(int numbits);
};

Derved undgås autokonvertering fra heltal til MinKlasse:
f(const MinKlasse& mk);
main() { f(42); } // ikke just det man forventer

Iøvrigt er jeg enig med de andre kommentarer om at det ville være en fed
ting med MinKlasse::MinKlasse(int numbits, int initvalue)

Spørgsmål til gruppen: Er det egentlig lovligt at skrive:
MinKlasse foo = (MinKlasse(32) = 42);

Det hænger vel på om man må kalde en non-const metode (nemlig operator=) på
et temporært objekt. Så vidt jeg husker må man godt kalde non-const metoder
på temp-objekter, men man må ikke give temp-objekter som non-const
reference-parametre til funktioner - husker jeg rigtigt?


Bjarke





Mogens Hansen (28-09-2002)
Kommentar
Fra : Mogens Hansen


Dato : 28-09-02 07:15


"Bjarke Dahl Ebert" <bebert@worldonline.dk> wrote in message
news:8u4l9.36466$Qk5.1633012@news010.worldonline.dk...

[8<8<8<]
> Spørgsmål til gruppen: Er det egentlig lovligt at skrive:
> MinKlasse foo = (MinKlasse(32) = 42);

Det kommer an på hvilken type "MinKlasse:erator=" returnerer.

Følgende
<code>
class foo
{
public:
explicit foo(unsigned numbits, int value = 0) :
numbits_(numbits),
value_(value) {}

foo& operator= (int value)
{
value_ = value;
return *this;
}

private:
unsigned numbits_;
int value_;
};

int main()
{
foo f1 = foo(56) = 78;
foo f2(56, 78);
}

</code>
ser ud til at være lovligt, og gør det som Thomas de Silva oprindeligt
spurgte om.
Dog med en lidt anden syntax;
Såvel "f1" og "f2" har "numbit_ == 56" og "value == 78", efter de er
constructed.
Hvis "foo:erator=" havde returneret "void" var det ikke lovligt - men det
er heller ikke en normal situation.

I bedste fald syntes jeg måden at initialisere "f1" er overranskende.

Bemærk iøvrigt at i C++ Starndard library findes klassen "std::bitset", hvor
antallet af bits er et template argument og værdien kan som en "unsigned
long" (i den udstrækning "unsigned long" har tilstrækkeligt mange bits) til
constructoren .

> Det hænger vel på om man må kalde en non-const metode (nemlig operator=)

> et temporært objekt. Så vidt jeg husker må man godt kalde non-const
metoder
> på temp-objekter, men man må ikke give temp-objekter som non-const
> reference-parametre til funktioner - husker jeg rigtigt?

Det er ikke helt præcist.

Spørgsmålet er ikke om objektet er temporært eller ej, men om konverteringen
er implicit.
Der bliver ikke foretaget implicit convertion for at kalde funktioner, der
tager et non-const reference argument.
Temporære objekter kan gives til en funktion, der tager en non-const
reference, såfremt det temporære objekt ikke er fremkommet ved en implicit
konvertering.

Se eventuelt
The C++ Programming Language, Special Edition
Bjarne Stroustrup
ISBN 0-201-70073-5
side 281.
eller C++ Standarden §13.3.2-3

<code>
class foo
{
public:
foo(unsigned numbits, int value = 0) :
numbits_(numbits),
value_(value) {}

foo& operator= (int value)
{
value_ = value;
return *this;
}

private:
unsigned numbits_;
int value_;
};

void bar1(foo& f);
void bar2(const foo& f);
void bar3(foo f);

int main()
{
bar1(1); // error
bar2(1); // ok
bar3(1); // ok
bar1(foo(1)); // ok
bar2(foo(1)); // ok
bar3(foo(1)); // ok
}
</code>

Venlig hilsen

Mogens Hansen



Mogens Hansen (25-09-2002)
Kommentar
Fra : Mogens Hansen


Dato : 25-09-02 13:14


"Thomas de Silva" <alamyx@softhome.netSPAM> wrote in message
news:ams0ar$2730$1@news.cybercity.dk...

> Imidlertid kan jeg ikke gøre sådan her
> CMinKlasse MitObjekt(56)=78;

Hvad havde du tænkt at det skulle betyde ?

Venlig hilsen

Mogens Hansen



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

Månedens bedste
Årets bedste
Sidste års bedste