Error: there is no corresponding function to call Counter :: Counter ()

I am getting this error when I try to compile the Arduino sketch. I can't see where he thinks I am trying to call Counter::Counter

with no arguments. What's going on here?

sketch/periodic_effect.cpp: In constructor 'PeriodicEffect::PeriodicEffect(uint32_t, uint32_t, Counter::Mode)':
periodic_effect.cpp:4: error: no matching function for call to 'Counter::Counter()'
 PeriodicEffect::PeriodicEffect( uint32_t durationMs, uint32_t periods, Counter::Mode mode) : Runnable(), periods(periods) {

      

periodic_effect.cpp

#include <Arduino.h>
#include "periodic_effect.h"

PeriodicEffect::PeriodicEffect( uint32_t durationMs, uint32_t periods, Counter::Mode mode) : Runnable(), periods(periods) {
  intervalMs = durationMs / periods;
  index = Counter(intervalMs, mode);
}


void PeriodicEffect::run() {
  uint32_t currTimeMs = millis();
  if( (currTimeMs - prevTimeMs) > intervalMs ) {
    applyChange();
    prevTimeMs = currTimeMs;
    index.increment();
  }
}

      

periodic_effect.h

#ifndef PERIODIC_EFFECT_H
#define PERIODIC_EFFECT_H

#include "counter.h"
#include "runnable.h"

class PeriodicEffect : public Runnable {

  public:
    PeriodicEffect( uint32_t durationMs, uint32_t periods, Counter::Mode mode = Counter::Mode::RESETTING );

    Counter index;

  private:
    uint32_t intervalMs, periods, prevTimeMs;

    virtual void applyChange() = 0;
    void run();
    virtual void setup() = 0;
};

#endif

      

counter.h

#ifndef COUNTER_H
#define COUNTER_H

#include <stdint.h>


class Counter {
  public:
    enum Mode { RESETTING, RETURNING };
    Counter(uint32_t limit, Counter::Mode mode = RESETTING, uint32_t index = 0);

    uint32_t getIndex();
    void increment();
    float percent();

  private:
    bool goingForward;
    uint32_t index;
    const uint32_t limit;
    Counter::Mode mode;

    void incrementReturning();
    void incrementResetting();

};

#endif

      

counter.cpp

#include "counter.h"

Counter::Counter(uint32_t limit, Counter::Mode mode, uint32_t index) : index(index), limit(limit), mode(mode) {
  goingForward = true;
}


uint32_t Counter::getIndex() {
  return index;
}


void Counter::increment() {
  switch( mode ) {
    case RESETTING : incrementResetting();
    case RETURNING : incrementReturning();
  }
}


void Counter::incrementResetting() {
  index = (index + 1) % limit;
}


void Counter::incrementReturning() {
  if( goingForward ) {
    index++;
    if( index >= limit ) {
      index = limit - 1;
      goingForward = false;
    }
  } else {
    index--;
    if( index <= 0 ) {
      index = 1;
      goingForward = true;
    }
  }
}


float Counter::percent() {
  return (float) index / (float) limit;
}

      

+3


source to share


2 answers


Your class PeriodicEffect

has a member variable Counter

, not a constructor. This means that the member variable must be configured by default, i.e. Built by a constructor without parameters. You didn't put it on.



You can either give a Counter

default constructor or leave the existing default constructor for all parameters. Or, you can create a constructor PeriodicEffect

with an initializer list to provide the correct parameters index

.

+4


source


PeriodicEffect::PeriodicEffect(
    uint32_t durationMs, uint32_t periods, Counter::Mode mode) :
    Runnable(), periods(periods) { /* ... */

      

PeriodicEffect

has a member Counter index;

. Since index

it is not in the initializer list of this constructor, it gets by default.

Statement



index = Counter(intervalMs, mode);

      

there is an assignment inside a constructor, not an initialization. Too late.

+1


source







All Articles