dynamic_cast

Minkähän takia seuraavassa koodissa oleva dynamic_cast operaatio ei onnistu? Ohjelma kaatuu ajonaikaisesti, kun suoritan tyyppimuunnosta Asiakkaasta Luottoasiakkaaksi. Ilmeisesti tyyppimuunnosa olisi mahdollista, mutta kun se yrittää sen tehdä, niin tulee jotain muistiongelmia. Debuggeri ilmoittaa seuraavaa:
Microsoft C exception:__non_rtti_object @ 0x0012fd1c. Eikö tuo RTTI liity enemmänkin typeid-operaattoriin... Missä mättää? Tyokaluna on c .Net. Virhe siis on jo alkuperäisessä kirjan malliesimerkissä, joka on kopsittu alle.

//har6.cpp
//C ja olio-ohjelmointi / Päivi Hietanen
//Luku 25, harjoitus 6
//Aihe:   public-periytyminen ja monimuotoisuus
//         Asiakas-luokka
//         HUOM. Modularisoi tämä harjoituksen vuoksi
#include
using namespace std;
#include
class Asiakas
{
   char asnro[6];
   char nimi[35];
public:
   virtual void Kysy();
   virtual void Nayta() const;
   virtual const char *Nimi() const {return nimi;}
   virtual void Velkasaldo() const {cout
10760
Äänestä

Muut lukivat myös

Vastaukset 10

Vanhimmat

kysy mureakuhasta

Äänestä

Castays on tuossa tapauksessa turhaa. Iffillä testataan onko pointteri tehty ja jos on niin sitten printataan.

case 4:

for (ind = 0; ind < 10 && asiakkaat[ind]; ind )
if (asiakkaat[ind])
asiakkaat[ind]->Luottokoodi();

break;

Äänestä
  • Tuolloin myös ei luotollisten asiakkaiden luottotiedot tulostetaan. Tarkoituksenahan on tulostaa pelkästään luotollisten asiakkaiden tiedot.

    Äänestä

  • Ei dynamic_cast tuossa ole turha vaan sillä varmistetaan, että kyseessä on todellakin Luottoasiakas.

    Ongelma saattaa liittyä RTTI:n. Tuo operaattori tekee ajonaikana (yleensä) typeid():n, josta siis virhe mikäli RTTI ei ole enabloitu.

    Äänestä

  • Luotollinen kirjoitti:

    Tuolloin myös ei luotollisten asiakkaiden luottotiedot tulostetaan. Tarkoituksenahan on tulostaa pelkästään luotollisten asiakkaiden tiedot.

    Mutta Asiakas-classin Luottokoodi() ei tee yhtään mitään.

    Äänestä

C Builder 6 personal edition
******************************
-Kun kopsaan tuon esimerkin tuollaisenaan,
ja ajan sen - mitään virheilmoituksia ei tule!

Äänestä
  • Ilmeisesti builderissa on poikkeusten käsittely valmiina, joka ei .Netssä ole vakio asetuksilla enabloituna.

    Äänestä

  • Poikkeusten käsittelijä kirjoitti:

    Ilmeisesti builderissa on poikkeusten käsittely valmiina, joka ei .Netssä ole vakio asetuksilla enabloituna.

    Aivan oikein!!
    **************
    Poikkeusten käsittely Options/C /Exception handling/Enable RTTI näyttää olevan vakiona päällä.Kun sen poistaa ,alkaa tulla virheitä eo.koodista.

    Äänestä

Ilmeisesti sen RTTI:n saa visual c .net:issäkin enabloitua.
Itselläni oli BCB:ssä samat virheilmoitukset,kuin sinullakin,kun RTTI oli
poissa käytöstä

Katso allaolevasta osoitteesta - siellä on ohjeet

http://cplus.about.com/od/beginnerctutorial/l/aa121302g.htm

Turning on RTTI in Visual C .net
*********************************
Runtime Type Identification allows identification of the type of object

referred to by a pointer or reference at runtime.

Äänestä

tuolla edes on koko dynamic_cast?

Äänestä

Kommentoi aloitusta


dynamic_cast kirjoitti:

Minkähän takia seuraavassa koodissa oleva dynamic_cast operaatio ei onnistu? Ohjelma kaatuu ajonaikaisesti, kun suoritan tyyppimuunnosta Asiakkaasta Luottoasiakkaaksi. Ilmeisesti tyyppimuunnosa olisi mahdollista, mutta kun se yrittää sen tehdä, niin tulee jotain muistiongelmia. Debuggeri ilmoittaa seuraavaa:
Microsoft C exception:__non_rtti_object @ 0x0012fd1c. Eikö tuo RTTI liity enemmänkin typeid-operaattoriin... Missä mättää? Tyokaluna on c .Net. Virhe siis on jo alkuperäisessä kirjan malliesimerkissä, joka on kopsittu alle.

//har6.cpp
//C ja olio-ohjelmointi / Päivi Hietanen
//Luku 25, harjoitus 6
//Aihe:   public-periytyminen ja monimuotoisuus
//         Asiakas-luokka
//         HUOM. Modularisoi tämä harjoituksen vuoksi
#include
using namespace std;
#include
class Asiakas
{
   char asnro[6];
   char nimi[35];
public:
   virtual void Kysy();
   virtual void Nayta() const;
   virtual const char *Nimi() const {return nimi;}
   virtual void Velkasaldo() const {cout

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu