Сообщение Re[3]: Статический класс или namespace для singleton? от 20.07.2023 23:36
Изменено 20.07.2023 23:38 kov_serg
Re[3]: Статический класс или namespace для singleton?
Здравствуйте, cppguard, Вы писали:
C>С таким подходом, как минимум, одна проблема — в конструкторе происходит неявная инициализация.
С чего бы это? Вас никто не заставляет пользоваться конструктором для инициализации, это можно делать отдельными методами.
C>Если об этом не знать, то можно дважды инициализировать устройство. Либо везде передавать ссылку на Serial, что тоже неудобно. А чем плох вариант с namespace? Состояние хранится в двух переменных — rx_buffer, tx_buffer. Они делаются статическими и перестают быть видимыми вне модуля. Инициализировать их не надо.
Зачем везде передавать ссылку на Serial просто пишите в классе MyMegaDevice и this будет неявно с вами
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>С таким подходом, как минимум, одна проблема — в конструкторе происходит неявная инициализация.
С чего бы это? Вас никто не заставляет пользоваться конструктором для инициализации, это можно делать отдельными методами.
C>Если об этом не знать, то можно дважды инициализировать устройство. Либо везде передавать ссылку на Serial, что тоже неудобно. А чем плох вариант с namespace? Состояние хранится в двух переменных — rx_buffer, tx_buffer. Они делаются статическими и перестают быть видимыми вне модуля. Инициализировать их не надо.
Зачем везде передавать ссылку на Serial просто пишите в классе MyMegaDevice и this будет неявно с вами
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();
...
}