21. november 2002 - 19:51Der er
10 kommentarer og 2 løsninger
Overførsel af datatype som objekt, samt pointer til funktion
Som java programmør der er ved at lære c++ føler jeg mig ind imellem lidt lost. Men det er vel derfor vi har eksperten. Jeg ønsker at implementere en funktion der som parametre tager: et Objekt (som er et array af en eller anden slags), en angivelse af typen i arrayet, en pointer til en funktion på denne type. Er der nogen der kan lede mig på rette vej med dette? Jeg savner bl.a. en måde at overføre en vilkårlig datatype til en funktion (ala et java Object).
Endelig skal det nævnes at løsningen SKAL implementeres i C++, så .net / COM osv. er desværre ikke brugbart...
Det vil i hvert fald kræve, at du laver noget (hårdt?) arbejdet på dine klasser, således at dine objekter kan identificere sig i forbindelse med at du refererer til det. Du har ikke i C++ nogen "top-klasse", så der er ikke nødvendigvis kun ét klassehierarki - i modsætning til Java. Du kan derfor ikke sikre, at alle objekter er af samme type, med mindre du har lavet en parameterisérbar type (altså en template af én eller anden slags, f.eks. vector<int> eller så'n). Men hvis du gør det, så er du da kommet langt, for så laver du en virtuel funktion på alle klasser i dette hierarki, der identificerer det konkrete objekt for funktionen. Husk, at i modsætning til Java er funktioner ikke virtuelle som standard... Ved brug af RTTI kan du lave den (meget omstændelige) løsning at forsøge at lave en <dynamic_cast> og gribe exceptions, hvis ikke det fungere. Men at lave mange casts er rimelig dyrt... Men hvis objektet identificerer sig behøver du jo heller ikke gøre så meget med casts...
"Jeg savner bl.a. en måde at overføre en vilkårlig datatype til en funktion" Det kan du da sagtens i C++, du har endda valget om du vil gøre det via copy, reference eller pointer og ikke som i Java, kun reference!
Du kan evt. prøve at beskrive, hvad det er du skal frem til, i stedet for hvordan du mener det skal implementeres i C++.
jpk, Jeg erkender at være faldet i det mest udbredte af alle anti patterns. Jeg ønsker at lave en quicksort implementation, der vil være så generel som muligt. Jeg har pt. løst det ved hjælp af template funktioner, og overloadede logiske sammenlignings operatorer. Det fungerer i princippet fint, men kunne godt tænke mig en løsning, hvor jeg som parameter til sorterings algoritmen angiver den metode der skal sammenlignes på. Såfremt det har interesse kan jeg paste min nuværende løsning ind her...
Er vi ikke inde i voldsomt overkill her - det manden spørger om, er metoden til at overførte et objekt og en funktion som parametre til en anden funktion (af resten af teksten, kan vi se det drejer sig om en SORT algortime.)
Svaret er at der FINDES en generel type "object" pointer i C - den hedder 'void *' ! Men - men mindre du selv implementerer det i alle (ALLE !) dine egne klasser, findes ingen .length metode, dvs. ingen umiddelbar måde at finde længden på hverken objectet eller det array af objecter du overfører.
Du kan se hvordan man (f.eks.) kunne løse dette, ved at kigge på implementeringen af standard qsort() metoden:
void qsort(void *base, int nelem, int width, int (*fcmp)(const void *, const void *));
base peger på array'et, nelem angiver hvor mange elementer der er i array'et , width hvor langt (i bytes) et element er, og fcmp peger på den compare fiunktion der skal bruges til at lave sammenligningerne.
Jeg synes bare meget bedre om metoden med at give en en iterator med, der ligeledes gør det transperent at skifte datastruktur, men uden at miste typeinformation.
Jeg ved godt at jeg ikke altid svarer på det der bliver spurgt om, men ofte kan man fornemme hvor spørgeren vil hen og give en alternativ løsning istedet.
Fx spørges der: Hvordan kan jeg tilføje en linie sidst i en tekstfil under Windows?
Svaret er simpelt, men hvis man vidste at formålet er at tilføje til en ini-fil, er det et helt andet, ikke? Netop fordi der eksisterer funktionalitet hetil...
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.