Я пытаюсь создать массив с типом T, поэтому он может быть целым числом, двойным или любым другим. Затем я сделал так, чтобы 0 не было нижней границей, чтобы вы могли установить любую нижнюю границу и верхнюю границу, какую захотите. Проблема с этим кодом я нахожу в основной функции. Он не должен выводить значения за пределы диапазона, в который я его ввел, но это всегда происходит. Для этого кода должно быть 12 — 5 + 1 = 8 элементов, но индексы с 1 по 12 доступны и не должны быть. Любая помощь приветствуется.
#include <iostream>
using namespace std;
//L for lower-bound, U for upper-bound
template <typename T, int L, int U>
class LBArray
{
public:
LBArray()
{
data = new T[U - L + 1];
}
T& operator[](int index)
{
return data[index];
}
private:
T* data;
};
int main(int argc, char** argv)
{
LBArray<int, 5, 12> data1;
for (int x = 1; x < 13; x++)
{
data1[x] = x;
cout << endl << "data1[" << x << "] = " << data1[x];
}
return 0;
}
Вы делаете слишком много работы. Одна вещь за один раз; один класс должен делать одно и только одно. Не путайте управление ресурсами и вычисления индекса. Просто создайте класс для обработки смещения вашего индекса и оставьте управление памятью кому-то другому:
template <typename T, std::size_t L, std::size_t U>
struct OffsetArray
{
static_assert(L < U, "Bad bounds");
static std::size_t const lower_bound = L;
static std::size_t const upper_bound = U;
T data[upper_bound - lower_bound];
T & operator[](std::size_t i) noexcept
{ return data[i - lower_bound]; }
T const & operator[](std::size_t i) const noexcept
{ return data[i - lower_bound]; }
std::size_t size() const noexcept
{ return upper_bound - lower_bound; }
// ...
};
Использование:
OffsetArray<int, 5, 13> x;
x[5] = 10;
Если вам нужны динамические контейнеры, вы всегда можете вставить массив в std::vector
или что-то подобное.