Avatar billede anjensen1 Novice
05. april 2005 - 15:24 Der er 8 kommentarer og
1 løsning

dobbelt dereference pure virtual class

nu må jeg se om jeg kan forklare det her...
i en abstract klasse K1 findes metoderne
m1 og m2
efter at have instansieret et obj af en childklasse
K1c så skriver vi en accessor metode

i denne metode findes konstruktionen
int tid=m_device->m1()->m2();
m_device er en pointer til K1
eg
K1 * m_device;
njamen hva er'ed dog der sker her
"m_device->m1()->m2()"
-iøvrigt fejler windows med ulovlig handling/sidefejl bla bla.... ;)

gøgemøjet er fra irrlicht implem. af en tidskeeper class, men det er sådan set ligemeget

mvh a.
Avatar billede arne_v Ekspert
05. april 2005 - 15:31 #1
m_device er en K1*, den har en m1 metode som du kalder og og får
returneret noget (også en K1* måske) som du kalder en metode m2 på ...

Hvis K1c arver fra K1 så undrer det mig lidt at det ikke er:

tid = m1()->m2();

altså m1 på sig selv fremfor på m_device ...
Avatar billede anjensen1 Novice
05. april 2005 - 15:57 #2
joo deeøh.. :)
men m_device er jo pointeren til superclass
..må hellere vise det hele istedet for at forsøge at forenkle problemet:

//timer class
class CIrrTimer  {
public:
  IrrlichtDevice *m_device;
  CIrrTimer() {};//defaultkonstruktør
 
  //konstruktør
  CIrrTimer(IrrlichtDevice *device)
  {
      m_device=device;
      resetTimer();
  } 
 

  int m_Time;
  int m_DeltaTime;
  irr::f32 m_TimeFactor;

//her er de så...........
  void resetTimer() {
        m_Time = m_device->getTimer()->getTime();
        }
 
  void updateTimer()
      {
      m_DeltaTime = m_device->getTimer()->getTime() - m_Time;
      m_Time += m_DeltaTime;
      m_TimeFactor = m_DeltaTime * 0.001f;
      };

};//class end

sagen er at jeg har stykket det her sammen af løse snippets og der er noget ..ged.. enten i de snippets eller min sammenstykning.. (begge er abs muligt:)
Det fejler jo -grueligt i selv samme øjeblik metoden(e) kaldes
Avatar billede bertelbrander Novice
05. april 2005 - 22:37 #3
Bliver CIrrTimer construct'et med en device? Sæt m_device til 0 i default constructor og check for 0 i i updateTimer og resetTimer.

Hvad returnerer getTimer()?
Avatar billede anjensen1 Novice
06. april 2005 - 13:08 #4
getTimer() retunerer en pointer til timer objektet ITimer
(en del af core i hovedklassen)
MEN.. det er en ren virtuel metode
fra api:
virtual ITimer* irr::IrrlichtDevice::getTimer      (            )      [pure virtual]
Returns a pointer to the ITimer object. With it the current Time can be received.
m_device skulle være null fordi
m_device=device;
og device er null i dens default
men null chec...hmm
altså
if(!m_device==0)
m_Time = m_device->getTimer()->getTime();
-god idé!!
crasher ikke, -men retunerer blot 0.. æv..
og dbl æv fordi med det null chek så -skulle- den jo 'arbejde' ..æv
Husk at lægge 'svar' :)

nb skal lige høre om jeg har den her
var=pt->m1()->m2()
siger
dereference af pointer til m1 retunerer en pointer til m2 som var så tildeles..
eg vi kunne skrive
* tmvar=pt->m1();
int var = tmvar->m2(); ?
Avatar billede anjensen1 Novice
06. april 2005 - 13:33 #5
:( ash såddan noget ævl..
den ER null og kommer aldrig i metoden
stumbp..
Avatar billede bertelbrander Novice
07. april 2005 - 01:29 #6
Jeg er ikke sikker på om jeg forstod, fik du løst problemet?
Svarene på dine spørgsmål er ja og ja.
Avatar billede anjensen1 Novice
07. april 2005 - 11:09 #7
nje -ka godt se at det rant ikke er så informativt:)
løst, nej -men jeg tror at det er en helt gal vej.
Der kommer sidefejl straks metoden updateTimer prøver med
m_DeltaTime = m_device->getTimer()->getTime() - m_Time;
Det er simpelt hen ikke en lovlig snippet.
-fint at forståelsen er det (i det mindste:)
Jeg tror at jeg dropper dén timer løsning og ser på noget med clock i ren cpp..
ialtfald tilbage til tegnebrættet-
husk at lægge 'svar'
mvh + tak.
Avatar billede arne_v Ekspert
10. april 2005 - 13:17 #8
jeg synes ikke at jeg har fortjent point her og Bertel plejer ikke at samle
på point så ...
Avatar billede anjensen1 Novice
11. april 2005 - 11:21 #9
så lukker jeg for ikke at have uesvarede sp på serberen.
Tak til alle.
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