casting

Tags:    c++

Hej
Jeg har en funktion der skal skabe et nyt objekt til min graf. Det skal være en afledt klasse af klassen Vertex. Altså f.eks DerivedVert:public Vertex.

På nuværende tidspunkt sender jeg en string til funktionen, jeg havde håbet på at jeg på en eller anden måde kunne benytte den string til at caste det nye objekt

eksempel:
Vertex* newVertex = new Vertex(x, y, data, first);

Så i stedet for en Vertex* skal jeg have en DerivedVert*, men da der findes mange afledte klasser af Vertex, skal jeg kunne bestemme hvilken der er tale om i dette tilfælde.

Det behøver ikke være som jeg har beskrevet det. Findes der smartere måder, eller kan det ovenstående overhovedet ikke lade sig gøre, så sig endelig til.

Man kunne måske forestille sig en switch, problemet er bare at jeg har rigtig mange afledte klasser.

Håber på lidt gode fif
Carsten



8 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
Funktionen ved vel hvilken klasse den skal lave via den streng der bliver givet til funktionen?



Hej
Jeg har en funktion der skal skabe et nyt objekt til min graf. Det skal være en afledt klasse af klassen Vertex. Altså f.eks DerivedVert:public Vertex.

På nuværende tidspunkt sender jeg en string til funktionen, jeg havde håbet på at jeg på en eller anden måde kunne benytte den string til at caste det nye objekt

eksempel:
Vertex* newVertex = new Vertex(x, y, data, first);

Så i stedet for en Vertex* skal jeg have en DerivedVert*, men da der findes mange afledte klasser af Vertex, skal jeg kunne bestemme hvilken der er tale om i dette tilfælde.

Det behøver ikke være som jeg har beskrevet det. Findes der smartere måder, eller kan det ovenstående overhovedet ikke lade sig gøre, så sig endelig til.

Man kunne måske forestille sig en switch, problemet er bare at jeg har rigtig mange afledte klasser.

Håber på lidt gode fif
Carsten



Til selve oprettelsen vil jeg anbefale at du bruger en factory. Denne factory generere så en instans af din subklasse og returner den som en type af din superklasse.

For at vurdere hvilken type, det er efterfølgende så kan det simplest gøres ved brug af dynamic_cast. Du forsøger altså at caste object til din subtype. Mislykkkes dette cast, så vil resultat heraf blive NULL.


class SuperClass;
class SubClass : public SuperClass;

SuperClass * pSuperClass = <create instance with factory>
SubClass * sub = dynamic_cast<SubClass *>(pSuperClass);
if (NULL == sub) {
// The subtype is NOT a 'SubClass'
// You might try another cast...
}


Hth




Indlæg senest redigeret d. 02.04.2008 17:34 af Bruger #10448
Jeg tvivler lidt på at der er en smart måde at gøre det på.

Hvordan ved funktionen der skal skabe den afledte class hvilken afledt class den skal oprette?

Bruger alle constructorerne samme parametre?



Hej tak for svar. Jeg vil forsøge mig med en factory, det virker spændende. Kendte slet ikke til konceptet, her til andre et wikipedia link: http://en.wikipedia.org/wiki/Factory_method

Hvis nu jeg løber ind i problemer så er jeg her igen om lidt :)

Hvad hvis nu jeg lavede en switch, hvilket umiddelbart virker nemt. Ville det være helt hul i hovedet med en switch på omkring 700 cases :s. Jeg har lavet et lille program der laver header og cpp filerne med subklasser, så det ville ikke være svært også at lave en switch samtidigt.

@Bertel
"Hvordan ved funktionen der skal skabe den afledte class hvilken afledt class den skal oprette?"
via den streng der bliver givet til funktionen

"Bruger alle constructorerne samme parametre?"
Ja, forskellen ligger i opfyldningen af nogle vectorer (som jeg nok laver om til en linked list).
Grundlæggende drejer det sig om en samling af knuder i en graf der har en række under punkter hvis mængde og type varierer.

Tror det var det
Mvh
Carsten



Spørgsmålet angående "hvordan ved funktionen ...", stillede jeg fordi der måske var mere intelligent måder end sende en streng.

Jeg tror du bliver nødt til at anvende en switch med 700 cases, hvis du virkeligt har brug for så mange forskellige class'er. Måske (og kun måske) var det bedre at lave et mindre antal classer og få det mindre antal classer til at opføre sig lidt forskelligt.

Jeg tror ikke at factories løser nogen problemer her.



Ok. en switch. Det er sgu ikke kønt :)
Men nu prøver jeg, og hvis den er helt gal så må jeg jo lave det om.

Martin fik mine point. Fordi han introducerede factory for mig. Det skal jeg lige tjekke nærmere ud.

Carsten



Hvis nogen synes det er interessant så valgte jeg en tredie løsning. Med strengen slår jeg op i en tekstfil og trækker den data ud jeg har brug for.

Mvh
Carsten




Jeg tror ikke at factories løser nogen problemer her.


Factories giver en abstraktion, der gør ens design mere fleksibilt idet man opnår en lavere kobling. Dette er nyttigt hvis man har mange variationer af en given type, da man kan abstrahere disse variationer fra.

Typisk vil man lave en factory som returnere et interface*, som alle typerne implementer. Herved kender klienten som bruger factory'en *ikke* til subtyperne, men kun til deres fælles interface, hvis kontrakt er en union af alle subtypernes.

*) I c++ er der ingen interfaces, så man laver en abstrakt klasse med pure virtual funktioner i stedet for.

HTH




t