05. marts 2001 - 16:41Der 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*/); };
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...
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...
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
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
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.
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æ.
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.
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.
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.