Avatar billede kamikaze Nybegynder
05. marts 2001 - 16:41 Der er 11 kommentarer og
1 løsning

Dynamisk casting af void-pointer...

Jeg har et 2-dimentionelt array af typen void-pointer, som privat attribut i en klasse (class Tab).
Jeg skal bruge en metode (SetVal) til at overføre værdier (af ukendt type) til dette array.
(Det skal IKKE være en template klasse...)

Min klasse(lidt forenklet):

class Tab
{
private:
  int  Row,
      Col;
  void *ptrTabel[1][1];
public:
  Tab (int Row, int Col);
  void SetVal (int Row, int Col /*HER*/);
};

Jeg bruger Borland C++ 5.02 compiler...

HJÆLP!!!!!!!!!!!!
Avatar billede roadkill Nybegynder
06. marts 2001 - 11:03 #1
void SetVal(int Row, int Col, void* ptr)

når du så kalder:

SetVal(0,0,(void *)minPointer);

Eller har jeg misforstået problemet?
Avatar billede kamikaze Nybegynder
06. marts 2001 - 12:02 #2
Hmmmmmm....
Ja, du har misforstået problemet, men du har ret i det du siger. problemet er bare at i selve implementeringen af metoden SetVal skal man typecaste, men eftersom man overfører en void-pointer ved man ikke hvad man skal caste til...
Avatar billede kamikaze Nybegynder
06. marts 2001 - 12:03 #3
Eller er der noget jeg har overset?????
Avatar billede roadkill Nybegynder
06. marts 2001 - 12:07 #4
Det er jo det, der er problemet med void-pointere... at de er typeløse. Du kan fx. ikke delete de objekter, du får ind i matricen, fordi de er void-pointere og du ikke kender deres \'rigtige\' type - derfor vil deres destructor aldrig blive kaldt.

Mit forslag:

Lav en superklasse TabelEntry, som bare er en tom skal, som alle dine objekter SKAL nedarve fra..

Så kan du skrive Tab:


        Programmering:
        C/C++
  Point
        60
  Søg

  Opdater siden
  Tip en ven




                            Dynamisk casting af void-pointer...
                                                                                  05/03 2001 16:41:34    60 point fra kamikaze


                          Jeg har et 2-dimentionelt array af typen void-pointer, som privat attribut i en klasse (class Tab).
                          Jeg skal bruge en metode (SetVal) til at overføre værdier (af ukendt type) til dette array.
                          (Det skal IKKE være en template klasse...)

                          Min klasse(lidt forenklet):

                          class Tab
                          {
                          private:
                            int  Row,
                                Col;
                            TabelEntry *ptrTabel[1][1];
                          public:
                            Tab (int Row, int Col);
                            void SetVal (int Row, int Col, TabelEntry *entry);
                          };

OG du kan manipulere indholdet af matricen på objektniveau, dvs. delete, tilgå (fælles) metoder, hvis der er nogen i TabelEntry osv...
Avatar billede tuxen Nybegynder
06. marts 2001 - 14:12 #5
Eller du kan gemme dine overførte data, som du ikke kender typen på, i et array af typen BYTE.
Så er det ligegyldigt hvad det er du gemmer, de bliver bare gemt som en række bytes.
Hvis du vil undersøge typen efterfølgende, kan du bruge sizeof, til at finde ud af hvor stor den type du vil gemme er, og på den måde hvilken type det så er.
ved ikke om det hjælper dig, men det er én måde at gøre det på.
Thue
Avatar billede roadkill Nybegynder
06. marts 2001 - 14:18 #6
>> tuxen : Det virker kun, hvis der er tale om statiske data, der ikke ændrer sig efter at de er røget ind i matricen.
Avatar billede tuxen Nybegynder
06. marts 2001 - 14:36 #7
Jeps, det virker en gang for hver gang SetVal blive kaldt.
Hvis de skal ændres og f.eks. puttes over i en kendt type, skal man igang med at undersøge sin type med sizeof, og så finde ud af om der er tale om en int, long, float eller double etc.
Thue
Avatar billede pstric Nybegynder
06. marts 2001 - 14:50 #8
kamikaze>> Hvis du vil bruge en void * så skal det være for at fortælle compileren at den ikke skal bekymre sig om datatypen, det skal du nok tage dig af. Men hvis du ikke engang selv ved, hvilken datatype du lægger ind i array\'et, så hjælper void * dig ikke.

Prøv lige at forklare lidt nærmere, hvorfor du vil overføre værdier af ukendt type.
Avatar billede kamikaze Nybegynder
06. marts 2001 - 21:56 #9
NÆRMERE FORKLARING:

Det jeg egentlig vil, er at lave et array af ukendte objekter, som attribut i en klasse. En instans af denne klasse, skal så indgå som attribut i en node-klasse i et binært træ.

Nogen forslag?
Avatar billede kamikaze Nybegynder
06. marts 2001 - 21:58 #10
roadkill -> Kan du ikke prøve at skrive TabelEntry
klassen, som du mener den skal se ud???
Avatar billede roadkill Nybegynder
07. marts 2001 - 09:14 #11
Som sagt skal det bare være en tom skal

class TabelEntry
{
public:
  TabelEntry();
  virtual ~TabelEntry();
};

Klassen i sig selv gør intet smart - det, som er smart, er at lade alle de klasser, som skal ind i din matrice, nedarve fra den:

class A : public TabelEntry

class B : public TabelEntry

osv.

fordi du så istedetfor den ret ubrugelige void-pointer kan bruge en TabelEntry-pointer alle steder, hvor du arbejder \'anonymt\' med de indsatte objekter... da de alle er specialiseringer af TabelEntry.
Avatar billede kamikaze Nybegynder
06. april 2001 - 17:08 #12
Jeg har fundet ud af at man ikke kan re-dimensionere den 2. dimension i et 2-dimentionelt array i run-time... Kun den 1.

Det man kan gøre, er at have en dobbelt pointer, hvor den ene peger på row og den anden på col.
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