реализация выброса исключений при инициализации объекта
есть вот такая програма на С++ . Она выводит суму чисел которые складывались в виде строки определенное количество раз
Например :
число : 5
сколько раз его сложить : 4
сума чисел : 6170
сами числа :
5
55
555
5555
код :
#include <iostream>
#include<sstream>
#include<vector>
#include<numeric>
#include<exception>
class EqualDigitsProgression {
public:
EqualDigitsProgression()
{
this->set_num(1);
this->set_times(1);
this->nums.reserve(this->times);
this->insert_nums();
}
EqualDigitsProgression(long long int num, long long int times){
this->set_num(num);
this->set_times(times);
this->nums.reserve(this->times);
this->insert_nums();
};
EqualDigitsProgression(const EqualDigitsProgression& other) {
this->set_num(other.num);
this->set_times(other.times);
this->nums.reserve(other.times);
this->insert_nums();
}
void set_num(long long int num) {
if (num <= 0) {
this->num = 1;
}
this->num = num;
}
void set_times(long long int times) {
if (times <= 0) {
this->times = 1;
}
this->times = times;
}
long long int get_num() {
return this->num;
}
long long int get_times() {
return this->times;
}
std::vector<long long int> get_nums() {
return this->nums.empty() ? std::vector<long long int>() : this->nums;
}
long long int calculate() {
return std::accumulate(this->nums.begin(), this->nums.end(), 0);
}
long long int operator() () {
return this->calculate();
}
private:
long long int num;
long long int times;
std::vector<long long int> nums;
std::string multiplication(std::string str, int times) {
std::string multiplicaded_str;
for (int i = 0; i < times; i++) {
multiplicaded_str += str;
}
return multiplicaded_str;
}
void insert_nums() {
for (int i = 1; i <= this->times; i++) {
this->nums.emplace_back(std::atoi(this->multiplication(std::to_string(this->num), i).c_str()));
}
}
};
int main()
{
EqualDigitsProgression edp(5,20);
std::cout << edp.calculate() << std::endl;
for (auto i : edp.get_nums()) {
std::cout << i <<std::endl;
}
std::cout << "result with functor : " << edp();
}
переменная times типа long long int и тип long long int вмещает только 19 цифр , а в данном примере переменная times имеет значение 20 что естественно же приведёт к ошибке и неправильной работе программы . Также приведет к ошибке переменная num ведь она тоже выйдет за пределы long long int
вот результат етого примера
Вопрос : Как правильно написать исключения для переменных times и num и главное где , в сеттерах или в конструкторе , не сломается ли програма если исключения выбросит в конструкторе ведь объект должен инициализироваться .
еще один вопрос с теории : Как вообще правильно работать с исключениями внутри класса .Где можно почитать или посмотреть примеры
