web-dev-qa-db-fra.com

allocation d'un objet d'erreur de type classe abstraite

Salut, je reçois l'erreur suivante et je ne sais vraiment pas pourquoi.

class InteSiVis: public ofBaseApp //{
,  public ofxMidiListener{

Cela se produit lorsque je fais hériter la classe inresivis de la classe ofxMidiListener et que j'obtiens l'erreur suivante dans le fichier source principal

int main( ){

ofSetupOpenGL(1920,1080, OF_WINDOW);            
ofRunApp( new InteSiVis()); // <-------- The error is here Allocating object of type abstract

}

C'est vraiment déroutant car j'ai essayé cela avec un autre exemple de la manière exacte et je n'ai pas cette erreur.

class testApp : public ofBaseApp, public ofxMidiListener {

int main(){
    ofSetupOpenGL(640, 480, OF_WINDOW);
    ofRunApp(new testApp());
}

Pourriez-vous me donner une idée de la raison pour laquelle je reçois cette erreur, j'appelle la classe de la même manière. Merci d'avance.

/// ---------------------------------- Modifier InteSiVis.h

class InteSiVis: public ofBaseApp //{
,  public ofxMidiListener{

public:
    InteSiVis() ;

    void setup();
    void update();
    void draw();
    void exit();

    void keyPressed(int key);
    void keyReleased(int key);

    // Make an Array of Particle Systems
    vector<FluidBodySim> mArrayFluidBodySim;

    FluidBodySim        mFluidBodySim       ;   ///< Simulation of fluid and rigid bodies

    int                 mStatusWindow       ;   ///< Identifier for status window
    unsigned            mFrame              ;   ///< Frame counter
    double              mTimeNow            ;   ///< Current virtual time
    int                 mMouseButtons[3]    ;   ///< Mouse buttons pressed
    bool                mInitialized        ;   ///< Whether this application has been initialized
    int                 mScenario           ;   ///< Which scenario is being simulated now

// Scene stuff
    ofEasyCam mEasyCam;
    ofLight light;

// Setting Shader stuff
    ofShader shader;
    ofxPostProcessing post;

// Sound

    float   * lAudioOut; /* outputs */
    float   * rAudioOut;

    float * lAudioIn; /* inputs */
    float * rAudioIn;

    int     initialBufferSize; /* buffer size */
    int     sampleRate;

    double wave,sample,outputs[2];

    maxiSample piano_A1, piano_AS1, piano_B1, piano_C1, piano_CS1, piano_D1, piano_DS1, piano_E1, piano_F1, piano_FS1, piano_G1, piano_GS1;

    vector<maxiPitchStretch<grainPlayerWin>*> stretches;

    maxiPitchStretch<grainPlayerWin> *ts, *ts2, *ts3, *ts4, *ts5;

    int nAverages;
    float *ifftOutput;
    int ifftSize;

//    // Playing the Wav Files
    void audioOut(float *output, int bufferSize, int nChannels);

    double speed, grainLength, rate;

    ofxMaxiFFT fft;
    ofxMaxiFFTOctaveAnalyzer oct;
    int current;
    double pos;


} ;

testApp.h

class testApp : public ofBaseApp, public ofxMidiListener {

public:

    void setup();
    void draw();
    void exit();

    void keyPressed(int key);
    void keyReleased(int key);

    void mouseMoved(int x, int y );
    void mouseDragged(int x, int y, int button);
    void mousePressed(int x, int y, int button);
    void mouseReleased();


    stringstream text;

    vector<ParticleSystem> ps;

    //----------------------Sound---------------------------

    void newMidiMessage(ofxMidiMessage& eventArgs);


    ofxMidiIn midiIn;
    ofxMidiOut midiOut;
    ofxMidiMessage midiMessage;

    void audioOut(float *output, int bufferSize, int nChannnels);

};

// ---------------- FONCTION VIRTUELLE vorticitydistribution.h

class IVorticityDistribution
{
    public:
        virtual Vec3 GetDomainSize( void ) const = 0 ;
        virtual void AssignVorticity( Vec3 & vorticity , const Vec3 & position , const Vec3 & vCenter ) const = 0 ;
} ;

class JetRing : public IVorticityDistribution
{
    public:
        /*! \brief Initialize parameters for a vortex ring (using a different formula from the other).

            The vorticity profile resulting from this is such that the induced velocity is in [0,1].

            \param fRadiusSlug - radius of central region where velocity is constant

            \param fThickness - thickness of vortex ring, i.e. radius of annular core

            \param vDirection - vector of ring axis, also vector of propagation

            \param fSpeed   - speed of slug

        */
        JetRing( const float & fRadiusSlug , const float & fThickness , const Vec3 & vDirection )
            : mRadiusSlug( fRadiusSlug )
            , mThickness( fThickness )
            , mRadiusOuter( mRadiusSlug + mThickness )
            , mDirection( vDirection )
        {
        }

        virtual Vec3 GetDomainSize( void ) const
        {
            const float boxSideLength   = 2.f * ( mRadiusOuter ) ;    // length of side of virtual cube
            return Vec3( 1.0f , 1.0f , 1.0f ) * boxSideLength ;
        }

        virtual void AssignVorticity( Vec3 & vorticity , const Vec3 & position , const Vec3 & vCenter ) const
        {

} ;
15
user3737372

Voici comment les choses fonctionnent:

class Base
{
        public:
         const std::string SayHi() { return "Hi"; } // a normal non-virtual method            
         virtual std::string GetName() { return ("Base"); } // a normal virtual method
         virtual int GetValue() = 0; // a pure virtual method
}; 

Lorsque vous déclarez testApp comme ceci class testApp : public Base { ... };:

méthodes non virtuelles normales sont hérités lorsqu'ils sont déclarés dans Base et sont immuables.

méthodes virtuelles normales sont hérités lorsqu'ils sont déclarés dans Base, vous pouvez les utiliser> tels qu'ils sont déjà déclarés ou les redéfinir pour répondre à un objectif particulier.

méthodes virtuelles pures ne sont pas définis, la classe parent ne dit que "si vous héritez de moi, vous DEVEZ les implémenter vous-même, en faisant correspondre strictement mon prototype (comment je les ai définis)

Si vous ne respectez pas ces règles, vous obtiendrez des erreurs.


Maintenant, vous devez être sûr qu'il n'y a pas de méthodes virtuelles pures dans ofBaseApp ni ofxMidiListener qui ne sont pas implémentées dans la classe children.

Puisque vous déclarez que la classe testApp ne fait aucune erreur, vous devez avoir une méthode virtuelle pure dans InteSiVis des classes parents que vous avez oublié d'implémenter.

22
user1585121

Eh bien, vous n'avez pas publié suffisamment d'informations pour en être sûr.

En règle générale, lorsque vous recevez un message indiquant que le compilateur est incapable de créer une classe de type abstrait dans laquelle vous essayez d'instancier une classe qui hérite d'une interface, cela signifie que vous n'avez pas fourni d'implémentation de l'une des méthodes purement virtuelles spécifiées par L'interface.

Dans votre implémentation de testApp, avez-vous spécifié une substitution de méthodes que vous n'avez pas spécifiées dans InteSiVis? Les signatures doivent correspondre exactement. S'ils diffèrent par une constante, une référence, un pointeur ou toute autre manière, vous obtiendrez cette erreur.

Si cela ne résout pas votre problème, veuillez publier des informations plus complètes. Au moins les signatures de ce qui a été implémenté dans InteSiVis et testApp.

2
Spacemoose