C++ 分配抽象类类型的对象时出错
嗨,我得到以下错误,我真的不确定为什么C++ 分配抽象类类型的对象时出错,c++,abstract-class,C++,Abstract Class,嗨,我得到以下错误,我真的不确定为什么 class InteSiVis: public ofBaseApp //{ , public ofxMidiListener{ 当我使inresivis类从OfXmidListener类继承并且在主源文件中出现以下错误时,就会发生这种情况 int main(){ 你能告诉我为什么我会犯这个错误吗?我是用同样的方式给全班打电话的。提前谢谢 ///----------------------------------编辑 感染性 class InteSiVi
class InteSiVis: public ofBaseApp //{
, public ofxMidiListener{
当我使inresivis类从OfXmidListener类继承并且在主源文件中出现以下错误时,就会发生这种情况
int main(){
你能告诉我为什么我会犯这个错误吗?我是用同样的方式给全班打电话的。提前谢谢
///----------------------------------编辑
感染性
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的实现中,是否指定了InteSiVis中未指定的任何方法的覆盖?签名必须完全匹配。如果它们以常量、引用、指针或任何其他方式存在差异,则会出现此错误
class testApp : public ofBaseApp, public ofxMidiListener {
int main(){
ofSetupOpenGL(640, 480, OF_WINDOW);
ofRunApp(new testApp());
}
如果这不能解决您的问题,请发布更完整的信息。至少是在InteSiVis和testApp中实现的签名。这就是工作原理:
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时类testApp:public Base{…};
:
普通非虚方法在基类中声明时被继承,并且是不可变的
普通虚拟方法是在基类中声明时继承的,您可以在声明时使用它们>,或者重新定义它们以适合特定用途
纯虚拟方法没有定义,父类只说“如果你从我继承,你必须自己实现,严格匹配我的原型(我是如何定义它们的)
如果你不遵守这些规则,你就会犯错误
现在,您必须确保在BaseApp的和XMIDListener的中都没有未实现到children类中的纯虚拟方法
由于您声明类testApp不会发生任何错误,您必须在InteSiVis中从忘记实现的父类中获得纯虚拟方法。您不能
new Type()
如果类定义包含纯虚拟方法。是否覆盖了两个基类中的所有纯虚拟方法?这不是唯一的错误消息。原因是(未能提供“某物”的实现)也应该存在。请继续阅读。我在inteSiVis类中没有虚拟方法,但我的代码的其余部分中确实有一些被inteSiVis类调用。这就是原因吗?使用虚拟类的替代方法是什么?不,如果您尊重其用法,使用它们是一件好事。您也调用相同的方法吗?”代码的其余部分"您在testApp中调用InteSiVis?不,testApp只是对midi设备的一个测试,InteSiVis使用了更多的方法,其中使用了一些虚拟方法,例如------------------------------------------------------------------------------------------------------------------------类科特迪瓦性分布{public:virtual Vec3 GetDomainSize(void)const=0;virtual void AssignVorticity(Vec3&vorticity,const Vec3&position,const Vec3&vCenter)const=0;};我在InteSiVis.h中使用了流体模拟,而testApp.h只使用了一个简单的粒子系统。我编辑了这个问题,其中包含了关于.h文件中的内容的完整信息。我使用了一些虚拟方法,因此如何使用它们进行更改?你不会听评论,看到两个实现(testApp和InteSiVis)InteSiVis实现了更多的方法,因此我们认为您一定在testApp中使用了一些纯虚拟方法实现。您能检查一下并返回给我们吗?如果您无法检查,或者您不了解,请添加ofBaseApp和OfXmidListener声明。是的,涡度分布仅在InteSiVis中使用,这就是虚拟函数存在的地方
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);
};
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
{
} ;
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
};