[C++ Builder] Problemen met dynamic_cast

Pagina: 1
Acties:

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:29
Ik ben bezig een progje te brouwen in C++ Builder. Alles gaat prima, maar ik stuit nu op een compiler error waar ik maar niet vanaf geraak.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class TUitgave : public TObject
{
  private:
    int    m_Id;
    int    m_UserId;
    int    m_CategorieId;
    int    m_TypeUitgave;
    AnsiString  m_Omschrijving;
    TDate    m_Datum;
    Currency    m_Bedrag;

    AnsiString  m_Categorie;

  public:
    TUitgave();
    TUitgave(int, int, int, int, AnsiString, TDate, Currency);

    __property int Id           = { read  = m_Id, write = m_Id };
    __property int UserId         = { read  = m_UserId, write = m_UserId };
    __property int CategorieId     = { read  = m_CategorieId,
                             write = m_CategorieId
                             };
    __property int TypeUitgave     = { read  = m_TypeUitgave,
                             write = m_TypeUitgave
                             };
    __property AnsiString Omschrijving = { read  = m_Omschrijving,
                             write = m_Omschrijving
                             };
    __property TDate Datum       = { read  = m_Datum,
                             write = m_Datum
                             };
    __property Currency Bedrag     = { read  = m_Bedrag, write = m_Bedrag};
    __property AnsiString Categorie    = { read  = m_Categorie,
                             write = m_Categorie
                             };
    virtual void __fastcall MaakListItem(TListItem*);

};

Bovenstaande is dus een class-definitie. Ik heb een ListView die allerlei instances van deze class weergeeft. In ieder ListItem zit er in de Data property een pointer naar een respectievelijk object van deze class.
Zo dus:
code:
1
2
3
 TUitgave* rec;
 rec = new TUitgave();
 ListItem->Data = pointer(rec);

Als ik de gegevens van het geselecteerde ListItem wil gaan accessen, doe ik dit als volgt:
code:
1
2
3
4
5
  TListItem*     SelItem;
  TUitgave*   SelObject;

  SelItem   = ListView->Selected;
  SelObject = dynamic_cast<TUitgave*>(SelItem->Data);

Als ik dit alles compileer, krijg ik op de lijn waar ik cast, volgende compiler error:
code:
1
[C++ Error] UitgaveCal.cpp(70): E2307 Type 'void' is not a defined class with virtual functions

Ik heb al in de help gekeken, maar daar ga ik geen oplossing vinden, want de class bevat virtual functions en de class is ook gekend in mijn unit.

Iemand die mij kan helpen?

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:29
Anybody out there who can help?

https://fgheysels.github.io/


  • mjax
  • Registratie: September 2000
  • Laatst online: 13-09 11:16
Wat staat er op regel 70?

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:29
Op donderdag 27 december 2001 13:43 schreef MarcKonings het volgende:
Wat staat er op regel 70?
Zoals ik al zei in m'n topic; deze code:
code:
1
SelObject = dynamic_cast<TUitgave*>(SelItem->Data);

https://fgheysels.github.io/


  • mjax
  • Registratie: September 2000
  • Laatst online: 13-09 11:16
Op donderdag 27 december 2001 13:57 schreef whoami het volgende:

[..]

Zoals ik al zei in m'n topic; deze code:
code:
1
SelObject = dynamic_cast<TUitgave*>(SelItem->Data);
Moet het sterretje niet ergens anders staan in deze regel? Het lijkt zo alsof je wil casten naar een class met de naam TUitgave*, maar je wilt volgens mij casten naar de class TUitgave en daar een pointer naartoe. Probeer het sterretje eens te verplaatsen. Ik ben zelf niet bekend met de dynamic_cast functie...

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Ik ken C++ Builder niet, maar neem aan dat TListItem::Data van het type void * is? In dat geval moet je toch gewoon doen:
code:
1
SelObject = (TUitgave*)(SelItem->Data);

Immers, TUitgave is geen subklasse van void ;)

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:29
Op donderdag 27 december 2001 14:14 schreef MarcKonings het volgende:

[..]

Moet het sterretje niet ergens anders staan in deze regel? Het lijkt zo alsof je wil casten naar een class met de naam TUitgave*, maar je wilt volgens mij casten naar de class TUitgave en daar een pointer naartoe. Probeer het sterretje eens te verplaatsen. Ik ben zelf niet bekend met de dynamic_cast functie...
Nee hoor, het heeft niets met het sterretje te maken. Het maakt C++ nl niet uit hoe je whitespaces gebruikt.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:29
Op donderdag 27 december 2001 14:24 schreef marcusk het volgende:
Ik ken C++ Builder niet, maar neem aan dat TListItem::Data van het type void * is? In dat geval moet je toch gewoon doen:
code:
1
SelObject = (TUitgave*)(SelItem->Data);

Immers, TUitgave is geen subklasse van void ;)
Op die manier werkt het, thx.

Ik gebruikte dynamic_cast bv deze code niet werkt:
code:
1
  SelPrimKey  = (TfrmDetCategorie*)(Sender)->CatId;

Hier heb ik wel gebruik moeten maken van de dynamic_cast fctie.
Thx anyway. Moest het zelf nog eens zo uitgeprobeerd hebben. |:(

https://fgheysels.github.io/


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 15-09 22:39
Lijkt wel of je dynamic_cast zeurt over die ene virtual functie die je erin hebt staan.

Heb je de mogelijkheid om het te proberen zonder die functie?

NB, het casten volgens de C manier, (wat je dus nu doet) is ongeveer gelijk aan casten met static_cast<...>, maar static_cast _kan_ nog wat meer typechecking doen.

Verder heb je dan nog reinterpret_cast<...> die bijna alles naar alles kan casten. (integers naar pointers bijvoorbeeld)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:11
Op donderdag 27 december 2001 14:14 schreef MarcKonings het volgende:

[..]

Moet het sterretje niet ergens anders staan in deze regel? Het lijkt zo alsof je wil casten naar een class met de naam TUitgave*, maar je wilt volgens mij casten naar de class TUitgave en daar een pointer naartoe. Probeer het sterretje eens te verplaatsen. Ik ben zelf niet bekend met de dynamic_cast functie...
De regel is goed ; de fout zit in 't argument ( moet van type TObject* zijn).
Het doeltype is wel degelijk TUitgave*. Dat is inderdaad een pointer naar class TUitgave, en wat er bedoeld is.
PS. dynamic_cast<> is geen functie - ingebouwde operator net zoals sizeof etc.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:11
Op vrijdag 28 december 2001 14:00 schreef farlane het volgende:
Lijkt wel of je dynamic_cast zeurt over die ene virtual functie die je erin hebt staan.

Heb je de mogelijkheid om het te proberen zonder die functie?

NB, het casten volgens de C manier, (wat je dus nu doet) is ongeveer gelijk aan casten met static_cast<...>, maar static_cast _kan_ nog wat meer typechecking doen.

Verder heb je dan nog reinterpret_cast<...> die bijna alles naar alles kan casten. (integers naar pointers bijvoorbeeld)
dynamic_cast werkt alleen als er een virtual functie aanwezig is. Wat er fout gaat is geen funcie te veel, maar te weinig: void heeft geen virtual functies dus je kunt niet van void* naar iets anders dynamic_cast'en.

dynamic_cast is veilig: een verkeerde cast wordt ontdekt en je krijgt dan een 0-pointer ipv onzin. Maar voor deze check moeten het begin- en eind-type tenminste 1 virtual functie hebben, en moet een van de twee een [in]directe base zijn van de ander. void is ongeschikt als base-> void* werkt niet in dynamic_cast<>

reinterpret_cast kan "veel" maar geen base pointers naar derived pointers converteren of terug; en het is zelfs gebruikelijk dat dit fout gaat. ( Hangt enigzins af van wat er allemaal in de class zit ).

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1