【发布时间】:2020-07-06 23:49:41
【问题描述】:
考虑以下示例,其中Derived 类的构造在其构造函数的初始值设定项列表中采用了一个指针。当然我要检查这个指针是否有效,否则抛出异常。
我的尝试阻止了程序崩溃,但 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;
}
【问题讨论】:
-
这听起来像XY problem。你能解释一下你为什么想要这个吗?
-
如果它得到无效值(代码中的-1),你就会把它扔进 Base ctor
-
如果使用空指针调用
Derived构造函数是无效的,为什么将参数类型设为指针?为什么不按值或引用传递,避免整个问题? -
@SanderDeDycker 实际上我将一个对象指针传递给
Derived类ctor 并且只需要一个成员来进行Base初始化-我只是通过使用int*来简化它
标签: c++ constructor derived-class