Funktion eller klasse - noget er galdt

Tags:    c++

Hej.
Jeg har i flere tilfælde siddet fast i et problem. Det går i alt sin enkelthed ud på at min kompiler (Borland command line version)tilsyneladende opfatter nedenstående som en funktion, og ikke som en klasse:
Fold kodeboks ind/udKode 


Hvis jeg fx prøver "sizeof(mitObjekt)" får jeg at vide at mitObjekt er en funktion.
Der er dog ingen problemer i at gøre følgende:
Fold kodeboks ind/udKode 

Er der nogen der kan fortælle mig hvorfor jeg (ikke?) er nød til at bruge temp?






Indlæg senest redigeret d. 23.10.2006 21:09 af Bruger #8874
9 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
Jeg har ikke problemet:

Fold kodeboks ind/udKode 


Prøv at poste et komplet eksempel der demonstrerer fejlen.



Ok her er de filer jeg har:
Fold kodeboks ind/udKode 

Fold kodeboks ind/udKode 

Fold kodeboks ind/udKode 

Fold kodeboks ind/udKode 

Fold kodeboks ind/udKode 

Håber det er til at finde rundt i.



Problemet er så vidt jeg kan se at constructoren til A forventer en reference til en B.
MyB() opretter et midlertidigt objekt af typen MyB, men du kan ikke binde en reference af typen B til dette midlertidige objekt.

Hvis du kikker på output af:
Fold kodeboks ind/udKode 


Kan du også se hvorfor det ikke er nogen særlig smart konstruktion. Det midlertige objekt (i mit tilfælde af type A, i dit MyB) vil blive nedlagt igen så snart B's constructor afslutter, dvs. inden vi kan nå at gøre brug af det.



Indlæg senest redigeret d. 23.10.2006 22:49 af Bruger #4996
Ja det virker jo ikke særlig smart...
Men der må da være en måde at gøre det på. Det virker dumt at skulle lave et "temp"-objekt først. Og man kan da ikke undlade reference/pointer hvis klassen er abstrakt?
Findes der en måde hvorpå man kan skære "temp" væk?
Kan man fx (i konstruktoren) læse referencens data, og så bruge dette til at konstruere den private pointer (dette er vel heller ikke muligt da man ikke kender denne klasse på forhånd)? Er der andre metoder?



Indlæg senest redigeret d. 24.10.2006 12:18 af Bruger #8874
Der er andre der har det samme problem:
http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.19
På siden er der også et forslag til en løsning.



Ja, det virker fint.
Tak for det :)

ps. er der nogen tilfælde hvor det er gyldigt at skrive:

A a(B());
//brug a

Jeg har set følgende i en bog, men da dele af programmet manglede, er jeg ikke sikker på præcis hvad der sker:

Fold kodeboks ind/udKode 




Indlæg senest redigeret d. 24.10.2006 22:29 af Bruger #8874
For at være mere præcis:
Jeg har en klasse hvis Konstruktør tager et argument af typen ImplementationDetails. ImplementationDetails er en abstrakt baseklasse, og indeholder de funktioner som min klasse så kalder (min klasse indeholder en pointer til et implementationDetails-objekt). Det er nødvendigt at min klasse ikke kender til ImplementationDetails arvende klasser. I dette er jeg kommet ud for to problemer:
Det første var det med at der var behov for en "temp", hvilket du har svaret på(dog se indlægget ovenfor). Det andet er hvordan jeg gemmer denne temporær, således at dens funktioner overskriver ImplementationDetails virtuelle funktioner. Da den jo kun er temporær hvordan gemmer jeg den så i min klasse?




Indlæg senest redigeret d. 25.10.2006 14:19 af Bruger #8874
Hvis du kikker på mit eksempel fra "23-10-06 22:49" kan du se at det virker hvis der er andre argumenter end objekter der der laves med default constructor. Det er det der sker med dit eksempel fra "24-10-06 21:08".

"Nogen" er nødt til at gemme objektet af typen ImplementationDetails indtil klassen der bruger det er færdig med det.
Hvis du igen kikker på mit eksempel fra "23-10-06 22:49" så er linien:
std::cout << "Whatever: " << b.a.i << std::endl;
Ugyldig, b.a eksisterer IKKE på det tidspunkt. a ophørte med at eksistere da b's constructor afslutttede.
Den lette metode er at lade klassen der bruger objektet slette det i sin destructor. For at det kan virke SKAL base klassen have en virtuel destructor:
Fold kodeboks ind/udKode 


Man kan indvende at det er grimt at lade en part oprette et objekt og en anden nedlægge det igen.
Man kan løse dette ved at bruge en "class factory":
http://damb.dk/classfactory.php



Ja, det virker fint.
Tak for hjælpen :)



t