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;
        }
    }
}