可以从不同选项中选择的子类

时间:2019-03-17 05:45:41

标签: c++ inheritance arduino polymorphism

我正在使用Arduino和一个LED灯带项目。我正在定义LEDPattern和LEDColourScheme类来控制LED的行为/外观。

pattern子类继承自父LEDPattern类,并控制打开哪些LED以及亮度。

配色方案子类继承自LEDcolourScheme父类并控制颜色。

我希望能够将每个LEDPattern子类配置为具有唯一的ColourSchemes选择。可以使用配置属性来初始化LEDPatterns和LEDColourSchemes。它们都定义了控制其自定义行为的虚拟方法。

对于模式,我使用了一组类实例:

#define NUM_PATTERNS 7
LedPattern* led_patterns[] = {
  new patternBeatPulseGenerator(true),  //Has a boolean configurable attribute that changes behaviour
  new patternBeatPulseGenerator(false), 
  new patternMovingSineWave(),
  new patternSolidBeatPulse(),
  new patternMovingSegments(),
  new patternRandomSparkle(),
  new patternSineWavePulse(),      
};

然后偶尔选择一个新的随机变量:

static LedPattern* pattern;
pattern_id = random(0,NUM_PATTERNS);
pattern = led_patterns[pattern_id];
patttern->initialise(); //Custom initialise method to 'reset' pattern each time it is selected (since instance is only initialized once when defined in array above)

现在,我希望能够对ColourSchemes做类似的事情,能够为每个Pattern定义一组ColourSchemes,并在Pattern类上有一个返回随机值的方法:

static ColourScheme* colour_scheme;
colour_scheme = pattern->GetColourScheme();
colour_scheme->initialise();

然后对于动画的每个“帧”,调用Pattern和ColourScheme方法:

pattern->newFrame();
colour_scheme->newFrame();

我尝试过这样定义它:

class LedPattern : public BaseLEDController {
  protected:
  ColourScheme* colour_schemes[6] = {
    new colourRainbow(0, 3), 
    new colourCycleBeatRed(),  
    new colourChangeOnBeat(),
    new colourRedHeart(),
    new colourRandom(),  
    new colourRainbow(3, 3),   
  };
  byte num_colour_schemes = 6;
  public:    
  virtual ColourScheme* getColourMode() {
    ColourScheme* colour_scheme;
    byte choice = random(0, num_colour_schemes );
    colour_scheme = colour_schemes[choice];
    colour_scheme->initialise();
    return colour_scheme;
  }
  ...
}

然后在子类中覆盖colour_schemes []数组,但是它似乎不起作用,它似乎继续使用基类配置。而且我认为colour_schemes数组中的实例是为每个PAttern类实例新创建的,因此会占用大量内存。 我也意识到将所有LEDPatterns和ColourSchemes作为初始化实例占用内存是不理想的,而实际上一次只使用其中的一个。因此,我想到的另一种方法是使用条件/ switch语句作为方法工厂来生成这样的实例:

virtual ColourScheme* getColourMode() {
byte choice = random(0, num_colour_schemes );
static ColourScheme* colour_scheme;
delete[] colour_scheme;  //Delete old one to free up memory
switch (choice) {
  case 0:
    colour_scheme= new colourRainbow(0, 3); //Static rainbow
    break;
  case 1:
    colour_scheme= new colourCycleBeatRed();
    break;
  case 2:
    colour_scheme= new colourChangeOnBeat();
    break;
  case 3:
    colour_scheme= new colourRedHeart();
    break;
  case 4:
    colour_scheme= new colourRandom();
    break;
  case 5:
    colour_scheme= new colourRainbow(3, 3); //Moving rainbow
    break;
  default:
    colour_scheme= new colourRainbow(3, 3); 
    break;
}
return colour_scheme;
}

这意味着一次将只有一个ColourScheme实例(如果我也做同样的事情,则为LEDPattern),这对内存有好处,这意味着我不需要自定义的initialize()方法来重置实例每次被选择(可以集成到标准类构造函数中)。

但是,更改LEDPattern子类上的ColourScheme配置变得很混乱...

如果有人对实现此功能的最佳方法有任何想法,将非常感谢!!奖励积分是否有可能将权重与每个Pattern / ColourScheme相关联,从而影响其被随机选择的可能性。

0 个答案:

没有答案