Windows - Win32/C ++ klasse arvelighedsproblem

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skriver et GL effekt system i min ansøgning, så jeg har en superklasse kaldet


cEffect - som håndterer indlæsning/parsning af konfigurationsfil for hver effekt


og anden arvet klassiker


cFX < navn > - for hver effekt jeg tilføjer (sløret, blomstrer, kaos, ...).


Koden er forenklet her, men ser sådan ud:


Class cEffect
{
    public:
     bool ParseString(...);

    private:
     int m\_nStartFrame;
     int m\_nEndFrame;
     float m\_fSpeed;
};


// Blur effect
Class cFXBlur : public cEffect
{
  public: 
   bool RenderFrame(...);
};
// Bloom effect
Class cFXBloom : public cEffect
{
  public: 
   bool RenderFrame(...);
};
// Scene drawing effect
Class cFXScene : public cEffect
{
  public: 
   bool RenderFrame(...);
};
// Clear the depth/color buffer
Class cFXClearBuffers : public cEffect
{
  public
   bool RenderFrame(...);
}


Nu håndterer demo-motoren en


std::vector<cEffect *> m\_pvEffects;


Vektor, der har en liste over effekter tilføjet.
Og når en effekt tilføjes til den aktuelle tid (lad os sige, at jeg tilføjer et sløret)
jeg tilføjer det som:


// Blur to be added 

cEffect *newEffect = new cFXBlur;
newEffect->SetStartTime(x);
newEffect->SetEndTime(y);
newEffect->SetPower(13.0f);
newEffect->SetTexture(...);

// Now add the effect to the effects list.
m\_pvEffects.push\_back(newEffect);


Nu, når jeg gengiver jeg iterere gennem m\_pvEffects liste - men også jeg vil gerne ringe
en RenderFrame metode (som er offentlig i hver CFX < navn > effekt).


(*it)->RenderFrame(...) 


Men kompilatoren siger:



  fejl C2039: 'RenderFrame': er ikke medlem af 'CEffect'



Jeg forstår godt, hvorfor det sker, men kan ikke tænke på en måde, hvordan kan jeg rette op på dette,
kan du hjælpe mig ud - det ser ud til at jeg tabte plottet ...


Tak for ethvert forslag, hvad kan jeg gøre for at tilføje CFX til en cEffect vektor og senere
brug -> RenderFrame metode?

Bedste reference


Du bør ændre din klasse cEffect til:


Class cEffect
{
    public:
     bool ParseString(...);
     virtual bool RenderFrame(...) = 0;

    private:
     int m\_nStartFrame;
     int m\_nEndFrame;
     float m\_fSpeed;
};


Du har brug for søgeordet virtual, hvis du vil omdefinere en metode i en underklasse. = 0 gør klassen cEffect abstrakt (dvs. du kan ikke oprette en genstand direkte af typen cEffect), derfor skal underklasser implementere metoden RenderFrame(...)

Andre referencer 1


Fejlen opstår, fordi cEffect ikke har nogen medlemsfunktion kaldet RenderFrame. Hvad du vil have, er en virtuel funktion, et grundlæggende koncept for objektorienteret programmering. Dybest set skal du tilføje en funktion


virtual bool RenderFrame(...);


til din cEffect definition. virtual søgeordet fortæller i grunden kompilatoren at løse det ved kørsel. Dette betyder, at hvis du kalder denne metode på en cEffect peger eller en reference , kaldes den tilsvarende metode i den konkrete afledte klasse denne pointer eller referencepunkt til. I dette tilfælde skal du også erklære metoden som virtuel i alle afledte klasser (selv om dette ikke er nødvendigt, det gør din kode klarere).


Hvis du ikke vil have basklassemetoden til at gøre noget, og du vil kræve, at alle afledte klasser tilsidesætter det med deres egen implementering, kan du gøre denne metode ren virtuel i baseklassen ved at decralring det som


virtual bool RenderFrame(...) = 0;


Dette fortæller i grunden kompilatoren, at dette er en abstrakt metode, som ikke har en konkret implementering og kun gennemføres af afledte klasser.


Dette er en meget forenklet forklaring (undskyldninger for enhver ekspert, som mener, at mine ordsprog ikke er 100\% præcise). Du bør læse mere materiale om objektorienteret programmering, især i forbindelse med C ++.