Информация об изменениях

Сообщение Re[3]: Статический класс или namespace для singleton? от 20.07.2023 23:36

Изменено 20.07.2023 23:38 kov_serg

Re[3]: Статический класс или namespace для singleton?
Здравствуйте, cppguard, Вы писали:


C>С таким подходом, как минимум, одна проблема — в конструкторе происходит неявная инициализация.

С чего бы это? Вас никто не заставляет пользоваться конструктором для инициализации, это можно делать отдельными методами.
struct SerialImpl : Serial {
  enum { buf_size=16 };
  char tx_buf[buf_size], rx_buf[buf_size];
  ...
} serial[2];
...
void Board::config() {
    serial[0].config(portA_config);
    serial[1].config(portB_config);
    ...
}
Serial Board::getMainSerial() { return serial[0]; }
Serial Board::getAuxSerial() { return serial[1]; }


C>Если об этом не знать, то можно дважды инициализировать устройство. Либо везде передавать ссылку на Serial, что тоже неудобно. А чем плох вариант с namespace? Состояние хранится в двух переменных — rx_buffer, tx_buffer. Они делаются статическими и перестают быть видимыми вне модуля. Инициализировать их не надо.


Зачем везде передавать ссылку на Serial просто пишите в классе MyMegaDevice и this будет неявно с вами
struct MyMegaDevice {
    Board board[1];
    void fn();
    ...
};
...
void MyMegaDevice::fn() {
    Serial *serial=board->getMainSerial();
    ...
}
Re[3]: Статический класс или namespace для singleton?
Здравствуйте, cppguard, Вы писали:


C>С таким подходом, как минимум, одна проблема — в конструкторе происходит неявная инициализация.

С чего бы это? Вас никто не заставляет пользоваться конструктором для инициализации, это можно делать отдельными методами.
struct SerialImpl : Serial {
  enum { buf_size=16 };
  char tx_buf[buf_size], rx_buf[buf_size];
  ...
} serial[2];
...
void Board::config() {
    serial[0].config(portA_config);
    serial[1].config(portB_config);
    ...
}
Serial* Board::getMainSerial() { return &serial[0]; }
Serial* Board::getAuxSerial() { return &serial[1]; }


C>Если об этом не знать, то можно дважды инициализировать устройство. Либо везде передавать ссылку на Serial, что тоже неудобно. А чем плох вариант с namespace? Состояние хранится в двух переменных — rx_buffer, tx_buffer. Они делаются статическими и перестают быть видимыми вне модуля. Инициализировать их не надо.


Зачем везде передавать ссылку на Serial просто пишите в классе MyMegaDevice и this будет неявно с вами
struct MyMegaDevice {
    Board board[1];
    void fn();
    ...
};
...
void MyMegaDevice::fn() {
    Serial *serial=board->getMainSerial();
    ...
}