Avatar billede christian-petersen Nybegynder
21. november 2002 - 19:51 Der 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...
Avatar billede arne_v Ekspert
21. november 2002 - 20:11 #1
Generelt kan du ikke lave de samme ting i standard
C++ som i Java m.h.t. dynamisk håndtering af typer.

I java kan du kalde en metode med et objekt og
inde i objektet spørgs om hvilken type det er.

Det kan du ikke i (standard) C++. Du kalder bare
med en adresse og den kan pege på hvad som helst.

Du kan lidt mere med RTTI.

Men jeg kan ikke lige umiddelbart se at det kan
løse dit ptoblem.
Avatar billede dittmer Nybegynder
21. november 2002 - 22:10 #2
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...

Mvh
Søren
Avatar billede jpk Nybegynder
22. november 2002 - 08:14 #3
"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++.
Avatar billede christian-petersen Nybegynder
22. november 2002 - 08:28 #4
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...
Avatar billede jpk Nybegynder
22. november 2002 - 09:19 #5
Er du klar over at en sådan allerede findes som standard i C++?

Du kan fx gøre sådan:

#include "iostream.h"
#include <vector>
#include <algorithm>
using namespace std;

class SortThis
{
public:
    SortThis(int val) : m_nVal(val) {};

    int m_nVal;
};

typedef vector<SortThis> SortThisVector;

bool STV_greater(const SortThis& st1, const SortThis& st2)
{
    return st1.m_nVal < st2.m_nVal;
}

void WriteSTV(SortThisVector& STV)
{
    SortThisVector::iterator it = STV.begin();
    while(it != STV.end())
    {
        cout << (*it++).m_nVal << endl;
    }
}

int main(int argc, char* argv[])
{
    SortThisVector STV;
    STV.push_back(SortThis(2));
    STV.push_back(SortThis(1));
    STV.push_back(SortThis(3));
    WriteSTV(STV);
    sort(STV.begin(), STV.end(), STV_greater);
    WriteSTV(STV);

    return 0;
}
Avatar billede soepro Nybegynder
25. november 2002 - 09:48 #6
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.
Avatar billede soepro Nybegynder
25. november 2002 - 09:49 #7
qsort() er defineret i <stdlih.h>
Avatar billede jpk Nybegynder
25. november 2002 - 09:54 #8
soepro >> netop det som mit eksempel viser brugen af...
Avatar billede soepro Nybegynder
25. november 2002 - 12:12 #9
jpk >> Nåeeh, jaaah !?! (Øhhh, hvor ?)
Avatar billede jpk Nybegynder
25. november 2002 - 12:39 #10
En standard sorteringsfunktion der kan sortere en række elementer udfra en funktion der angives...
Avatar billede soepro Nybegynder
26. november 2002 - 10:04 #11
jpk >> Det var vel mere pendanten til Object (dvs. void *) han spurgte efter !
Avatar billede jpk Nybegynder
26. november 2002 - 11:07 #12
soepro >> jo det har du helt ret i...

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...
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester