#include #include class Stock { int capacity_; int used_; public: Stock(int capacity, int used) : capacity_(capacity), used_(used) { if (capacity < 0 || used < 0 || used > capacity) throw std::invalid_argument("invalid stock"); } int used() const noexcept { return used_; } void reserve(int amount) { if (amount < 0) throw std::invalid_argument("negative amount"); if (amount > capacity_ - used_) throw std::out_of_range("no capacity"); used_ += amount; } }; int main() { Stock s(10, 3); s.reserve(7); assert(s.used() == 10); bool rejected = false; try { s.reserve(1); } catch (const std::out_of_range&) { rejected = true; } assert(rejected && s.used() == 10); rejected = false; try { Stock invalid(2, 3); } catch (const std::invalid_argument&) { rejected = true; } assert(rejected); Stock copy = s; copy.reserve(0); assert(copy.used() == s.used()); }