Можете ли вы использовать разные константы для объектов класса в C ++? - PullRequest
0 голосов
/ 07 мая 2020

Я наткнулся на класс, единственной целью которого было создание мигающих светодиодов. Он использовал класс для 2 объектов, у которых был разный интервал мигания. Я начал думать, как использовать константы, но мне ничего не пришло.

Можно ли использовать const int в сочетании с конструктором для использования разных констант для объектов?

Я в курсе. что const int должен быть инициализирован в том же месте, где он объявлен, поэтому я предполагаю, что ответ будет «нет»

Если нет, есть ли обходные пути для достижения того же? Это использование разных констант (что снижает использование памяти) для разных объектов одного типа.

Используемая платформа, о которой идет речь, - это IDE arduino и atmega328P. Может быть, компилятор распознает, что переменные фактически используются как константы, и рассматривает их как таковые?

.h

class   BlinkingLed
{
private:
    int   blPin;
    short blinkInterval; // <-- the contant
    bool  blinking;
    bool  ledOn;
    long  lastTime;

public:
    BlinkingLed(int, int);
    void setBlinkInterval(int); // never used, should not exist
    int  getBlinkInterval();    // never used, should not exist
    void setLedOn(bool);
    bool getLedOn();
    void attachPin();
    void heartBeat();
};

. cpp

BlinkingLed::BlinkingLed(int aPin, int aBlinkInterval) // constructor
{
    blPin = aPin;
    blinking = false;
    ledOn = false;
    blinkInterval = aBlinkInterval; // <-- the contant
}

Объекты создаются этой линией. Классу aki требуется 2 объекта BlinkingLed.

AKI aki(new BlinkingLed(23,333), new BlinkingLed(22,667), 24); // Red blinks 90/minute, green 45/minute

Это конструктор aki:

AKI::AKI(BlinkingLed *aRedLight, BlinkingLed *aGreenLight, int aBellPin)
{
    redLight = aRedLight;
    greenLight = aGreenLight;
    bellPin = aBellPin;
}

333 и 367 хранятся в переменных, и я хочу, чтобы они стали константами для сохранения пространство памяти. Как мне это сделать?

1 Ответ

2 голосов
/ 07 мая 2020

Подводя итоги обсуждения и исправляя некоторые из ваших неправильных предположений:

class   BlinkingLed {
private:
    const byte   blPin;  // This should definitely be const
    const unsigned short blinkInterval; // <-- the desired constant (why?)
    bool  blinking;
    bool  ledOn;
    unsigned long  lastTime;

public:
    BlinkingLed(byte pin, unsigned short interval) 
       : blPin(pin), blinkInterval(interval)  {}

    // void setBlinkInterval(int); // impossible for a const Interval

    void init() {pinMode(blPin, OUTPUT);}  // should not be done in a c'tor
    void run(); // to be called as often as possible for a smooth heartbeat

    unsigned short  getBlinkInterval() {return blinkInterval;}  // why not
    void setLed(bool); // stops blinking
    bool isLedOn();
    void heartBeat();  // start blinking
};

Кстати: тип данных int обычно обвиняет вас в том, что вы не думаете об этом. :)

...