void Stream::writeW(uint16_t x) {
write(&x, 2);
}
void Stream::seek(uint64_t x) { throw std::logic_error("This stream cannot seek!"); }
Для абстрактных интерфейсных классов не нужно делать вызов конструктора и производном классе из-за того, что в нем нет данных, а только функции
Вызов конструктора родителя делается для изменения данных такового, в случае с File проверяем доступность дескриптора вызовом конструктора HandleStream
File::File(const wchar_t* aFname, OpenMode aMode) : HandleStream(INVALID_HANDLE)
{
HANDLE newHandle = CreateFile(…);
if () {
open(newHandle);
} else {
// придумаем, что делать с ошибками
}
}
else rear->next = add; // Пристраиваем за тем, на который «смотрит» rear
rear = add; // Перенаправляем rear (нужно в обеих ветвях и вынесено за скобки)
Ведь теперь если я обращусь к rear->next то получу nullptr, ведь это последний элемент, куда же тогда теряется прошлая нода?
Бывают классы, не знающие ни размера, ни позиции, но знающие остаток (скажем, порт).
Бывают классы, для которых вызов размера и позиции — это расточительство (скажем, буфер памяти).
Но в целом такая эталонная реализация говорит, что такое remainder() и как его считать.
…Но это уже офтоп для нашей темы — недореализованного класса.