web-dev-qa-db-ja.com

抽象クラス型エラーのオブジェクトの割り当て

こんにちは私は次のエラーを受け取り、なぜその理由が本当にわかりません。

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

これは、inresivisクラスにofxMidiListenerクラスを継承させ、メインソースファイルで次のエラーが発生した場合に発生します。

int main(){

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

}

正確な方法で別の例を試してみましたが、このエラーが発生しないため、これは本当に混乱します。

class testApp : public ofBaseApp, public ofxMidiListener {

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

このエラーが発生する理由を教えてください。まったく同じ方法でクラスを呼び出しています。前もって感謝します。

///----------------------------------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);

};

// ----------------仮想関数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

これはどのように機能するかです:

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
}; 

このようにtestAppを宣言するとclass testApp : public Base { ... };

通常の非仮想メソッドは、Base内で宣言されているため継承され、不変です。

通常の仮想メソッドはBase内で宣言されているため継承されます。すでに宣言されているように使用するか、特定の目的に合わせて再定義できます。

純粋な仮想メソッドは定義されていません。親クラスは、「私から継承する場合は、自分で実装する必要があり、私のプロトタイプに厳密に一致するように定義します(どのように定義したか)

これらのルールに従わない場合、エラーが発生します。


ここで、子クラスに実装されていないofBaseApp内に純粋な仮想メソッドがないofxMidiListenerがないことを確認する必要があります。

クラスtestAppはエラーを発生させないと述べているため、実装するのを忘れた親クラスからのInteSiVisに純粋な仮想メソッドが必要です。

22
user1585121

確かに、十分な情報を投稿していません。

通常、コンパイラが抽象型のクラスを作成できないというメッセージを受け取った場合、インターフェイスから継承するクラスをインスタンス化しようとしています。これは、インターフェース。

TestAppの実装で、InteSiVisで指定していないメソッドのオーバーライドを指定しましたか?署名正確に一致する必要があります。それらがconst、ref、ポインタ、またはその他の方法で異なる場合、このエラーが発生します。

これで問題が解決しない場合は、より完全な情報を投稿してください。少なくともInteSiVisとtestAppに実装されているもののシグネチャ。

2
Spacemoose