Рассмотрим следующий пример, где конструкция класса Derived
берет указатель на список инициализатора его конструктора. Конечно, я хочу проверить, действителен ли этот указатель, и выдать исключение в противном случае.
Моя попытка не позволяет программе обработать sh, но часть Base
все еще создается, прежде чем я смогу выдать исключение.
Есть ли способ предотвратить вызов конструктора класса Base
в этом случае?
#include <stdlib.h>
#include <iostream>
class Base
{
public:
Base(int val) : val_b(val)
{
std::cout << "Base::CTOR" << std::endl;
}
~Base() { }
int val_b;
};
class Derived : public Base
{
public:
Derived(int *, int);
~Derived() { }
int val_d;
void print(void)
{
std::cout << "Base:\t" << val_b << std::endl;
std::cout << "Derived:" << val_d << std::endl;
}
};
Derived::Derived(int *val1, int val2) : Base(val1 ? *val1 : -1), val_d(val2)
{
if (!val1)
{
throw std::invalid_argument("bad pointer");
}
}
int main()
{
int *a = NULL;
int b = 43;
try
{
Derived *d = new Derived(a, b);
d->print();
}
catch (std::exception &e)
{
std::cout << "Exception: " << e.what() << std::endl;
}
return 0;
}