Class 使用默认构造函数初始化失败
Class initialization fails with default constructor
我正在学习 C++ 中的 类,我创建了一个简单的,它使用动态 int 数组创建从 int a 到 int b 的间隔。这是代码:
Interval::Interval() {
a_ = 0;
b_ = 0;
interval = new int[2];
for (int i = 0; i <= 1; ++i) {
interval[i] = 0;
}
}
Interval::Interval(int a, int b) {
if (a > b) Interval(); // doesn't seem to work?
else if (a == b) {
a_ = a;
b_ = b;
interval = new int[2];
for (int i = 0; i <= 1; ++i) {
interval[i] = a;
}
} else {
a_ = a;
b_ = b;
int size = b - a + 1;
interval = new int[size];
for (int i = 0; i < size; ++i) {
interval[i] = a++;
}
}
}
Interval::~Interval() {
delete[] interval;
cout << "Destructed\n";
}
然而,在这部分:
if (a > b) Interval();
它似乎没有创建它。我哪里错了?
编辑:正如 molbdnilo 所回答的,我只是在构造函数的范围内创建一个单独的对象,而没有对其进行分配或对其进行任何操作。
这一行
if (a > b) Interval();
当条件满足时,默认构造一个临时的Interval
,在行尾销毁。
您的代码看起来相当复杂。该数组应该是 std::vector
这样您就不必乱用手动内存分配。无论如何,为了得到你想要的东西“在那种情况下我想要默认构造的对象。”简单的解决方法如下:
if (a > b) {
a = 0;
b = 0;
}
if (a == b) {
a_ = a;
b_ = b;
interval = new int[2];
for (int i = 0; i <= 1; ++i) {
interval[i] = a;
}
} else { ...
注意到您的默认构造函数等同于 Interval(0,0)
,您可以重用 non-default 构造函数,方法是转发给它:
Interval::Interval() : Interval(0,0) {}
Interval::Interval(int a, int b)
: a_(a <= b ? a : 0),
b_(a <= b ? b : 0)
{
if (a_ == b_) {
interval = new int[2] {a_, a_};
} else {
int size = b_ - a_ + 1;
interval = new int[size];
for (int i = 0; i < size; ++i) {
interval[i] = a_ + i;
}
}
}
我正在学习 C++ 中的 类,我创建了一个简单的,它使用动态 int 数组创建从 int a 到 int b 的间隔。这是代码:
Interval::Interval() {
a_ = 0;
b_ = 0;
interval = new int[2];
for (int i = 0; i <= 1; ++i) {
interval[i] = 0;
}
}
Interval::Interval(int a, int b) {
if (a > b) Interval(); // doesn't seem to work?
else if (a == b) {
a_ = a;
b_ = b;
interval = new int[2];
for (int i = 0; i <= 1; ++i) {
interval[i] = a;
}
} else {
a_ = a;
b_ = b;
int size = b - a + 1;
interval = new int[size];
for (int i = 0; i < size; ++i) {
interval[i] = a++;
}
}
}
Interval::~Interval() {
delete[] interval;
cout << "Destructed\n";
}
然而,在这部分:
if (a > b) Interval();
它似乎没有创建它。我哪里错了?
编辑:正如 molbdnilo 所回答的,我只是在构造函数的范围内创建一个单独的对象,而没有对其进行分配或对其进行任何操作。
这一行
if (a > b) Interval();
当条件满足时,默认构造一个临时的Interval
,在行尾销毁。
您的代码看起来相当复杂。该数组应该是 std::vector
这样您就不必乱用手动内存分配。无论如何,为了得到你想要的东西“在那种情况下我想要默认构造的对象。”简单的解决方法如下:
if (a > b) {
a = 0;
b = 0;
}
if (a == b) {
a_ = a;
b_ = b;
interval = new int[2];
for (int i = 0; i <= 1; ++i) {
interval[i] = a;
}
} else { ...
注意到您的默认构造函数等同于 Interval(0,0)
,您可以重用 non-default 构造函数,方法是转发给它:
Interval::Interval() : Interval(0,0) {}
Interval::Interval(int a, int b)
: a_(a <= b ? a : 0),
b_(a <= b ? b : 0)
{
if (a_ == b_) {
interval = new int[2] {a_, a_};
} else {
int size = b_ - a_ + 1;
interval = new int[size];
for (int i = 0; i < size; ++i) {
interval[i] = a_ + i;
}
}
}