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
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
Vastaukset 10
Vanhimmat
kysy mureakuhasta
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;
Tuolloin myös ei luotollisten asiakkaiden luottotiedot tulostetaan. Tarkoituksenahan on tulostaa pelkästään luotollisten asiakkaiden tiedot.
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.
Mutta Asiakas-classin Luottokoodi() ei tee yhtään mitään.
C Builder 6 personal edition
******************************
-Kun kopsaan tuon esimerkin tuollaisenaan,
ja ajan sen - mitään virheilmoituksia ei tule!
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.
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.
tuolla edes on koko dynamic_cast?