Я изучаю классы на С++ и создал простой, который просто создает интервал от int a до int b, используя динамический массив int. Вот код:
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();
Вроде не создает. Где я не прав?
Это не решает вопрос, но interval
должно быть просто int interval[2];
. Здесь нет необходимости в динамическом размещении. Также петли обычно пишут for (int i = 0; i < 2; ++i)
. Петли в том виде, в котором они написаны, работают правильно, но большинство читателей на мгновение остановятся, спросив, почему это написано именно так.
Да, хороший момент. @t.niese В этом случае я хочу создать объект по умолчанию. Как мне обойтись без повторного написания одного и того же фрагмента кода?
Эта линия
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 { ...
Для массива, который всегда состоит из двух элементов, я бы не стал использовать std::vector
. Я бы использовал либо std::array
, либо необработанный массив.
@Peter, я тоже так думал, но он не всегда состоит из двух элементов. Когда a <b
OP заполняет массив всеми целыми числами от a до b.
Отметив, что ваш конструктор по умолчанию эквивалентен Interval(0,0)
, вместо этого вы можете повторно использовать конструктор не по умолчанию, перенаправив на него:
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;
}
}
}
Что вы ожидаете от
if (a > b) Interval();
? (Он создает объект, который не используется сразу после уничтожения в концеif
)