gpt4 book ai didi

C++修改基类不影响继承类

转载 作者:行者123 更新时间:2023-11-30 01:38:33 27 4
gpt4 key购买 nike

我有一个基类,它被不同项目中的许多其他类继承。一个项目需要添加到基类。不幸的是,当我尝试编译所有其他项目时,这会引发错误。

基类:

class MidiBase
{
public:
virtual void midiNoteOnReceived(unsigned char note, unsigned char velocity) = 0;
virtual void midiNoteOffReceived(unsigned char note) = 0;
virtual void midiClockStartReceived(void) = 0;
virtual void midiClockStopReceived(void) = 0;
virtual void midiSysexStartReceived(void) = 0;
virtual void midiSysexDataReceived(unsigned char index, unsigned char data) = 0;
virtual void midiSysexStopReceived(void) = 0;
virtual void midiSysexWrite(unsigned char data) = 0;
virtual void midiControlChangeReceived(unsigned char cc, unsigned char val) = 0;
virtual void midiPitchBendReceived(char bend) = 0;
virtual void midiProgramChangeReceived(unsigned char patchNum) = 0; //THIS IS THE NEW LINE
};

示例继承类不需要使用换行符,但没有它就无法编译:

#include "Midi.h"
#include "MidiBase.h"

class OdyEngine : public MidiBase
{
//variables
public:
static OdyEngine& getInstance()
{
static OdyEngine instance; // Guaranteed to be destroyed.
return instance;
}
protected:
private:
Midi* midi_;
//functions
public:
const Midi* getMidiPtr() const { return midi_; }
Midi* getMidiPtr() { return midi_; }
void midiControlChangeReceived(unsigned char anlControl_, unsigned char val);
void midiNoteOnReceived(unsigned char note, unsigned char velocity);
void midiNoteOffReceived(unsigned char note);
void midiClockStartReceived(void){}
void midiClockStopReceived(void){}
void midiSysexStartReceived(void){}
void midiSysexDataReceived(unsigned char index, unsigned char data){}
void midiSysexStopReceived(void){}
void midiSysexWrite(unsigned char data){}
void midiChannelChanged(unsigned char channel);
void midiPitchBendReceived(char bend);
//void midiProgramChangeReceived(unsigned char patchNum){} //WILL NOT COMPILE WITHOUT THIS
protected:
private:
OdyEngine(OdyEngineBase* base);
OdyEngine() {}
OdyEngine( const OdyEngine &c );
~OdyEngine();
OdyEngine& operator=( const OdyEngine &c );

}; //OdyEngine

有什么方法可以将新代码添加到基类而不必修改使用它的每个继承类,因为我只需要在 1 个继承类中使用新函数。

最佳答案

如果将无操作实现添加到基类,则无需在每个单独的项目中添加它。 (可选)包含一个断言,如果它在没有被正确实现覆盖的情况下被调用,就会发出警报:

virtual void midiProgramChangeReceived(unsigned char patchNum) {
assert (!"Unimplemented function, please override with an implementation.");
}

第二个选项是#ifdef 代码,它对不需要它的项目隐藏此功能。在编译时为需要它的项目启用它:c++ -DENABLE_MINI_PROGRAM_CHANGE_RECEIVED myprog.cpp。该功能在其他项目中不会存在;因此没有人会错误地调用它,并且虚方法表中没有开销。缺点是代码中的#ifdef cruft。

#ifdef ENABLE_MIDI_PROGRAM_CHANGE_RECEIVED
virtual void midiProgramChangeReceived(unsigned char patchNum) = 0;
#endif

跑题了,不过也可以考虑在继承类的虚方法中加入override:

void midiClockStopReceived(void) override {}

如果您的方法签名错误,或者如果它在未来发生变化,这将用编译错误替换细微的不当行为。这是对 C++11 的成功改进。

关于C++修改基类不影响继承类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47595383/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com