C++ 如何在模板(在C+;+;)中正确设置和传递数组边界?

C++ 如何在模板(在C+;+;)中正确设置和传递数组边界?,c++,arrays,templates,indexoutofboundsexception,C++,Arrays,Templates,Indexoutofboundsexception,我正在尝试创建一个typename T数组,因此它可以是int、double或任何形式。然后我去做了一个0不是下限的地方——你可以设置你想要的任何下限和上限。我发现这段代码的问题在main函数中。它不应该打印出超出我输入范围的值,但它总是这样。对于这段代码,它应该是12-5+1=8个元素,但是索引1到12是可访问的,不应该是可访问的。感谢您的帮助 #include <iostream> using namespace std; //L for lower-bound, U for

我正在尝试创建一个typename T数组,因此它可以是int、double或任何形式。然后我去做了一个0不是下限的地方——你可以设置你想要的任何下限和上限。我发现这段代码的问题在main函数中。它不应该打印出超出我输入范围的值,但它总是这样。对于这段代码,它应该是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;
}

#包括
使用名称空间std;
//L代表下限,U代表上限
模板
类LBArray
{
公众:
LBArray()
{
数据=新的T[U-L+1];
}
T&运算符[](整数索引)
{
返回数据[索引];
}
私人:
T*数据;
};
int main(int argc,字符**argv)
{
LBArray data1;
对于(int x=1;x<13;x++)
{
数据1[x]=x;

cout你做的工作太多了。一次只能做一件事;一个类只能做一件事。不要将资源管理和索引计算混为一谈。只需创建一个类来处理索引偏移,并将内存管理留给其他人:

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

    // ...
};
模板
星外结构
{
静态断言(L
用法:

OffsetArray<int, 5, 13> x;
x[5] = 10;
OffsetArray x;
x[5]=10;

如果您需要动态容器,您可以始终将数组粘贴到
std::vector
或类似的位置。

您没有将
运算符[]
索引
参数映射到适当的范围。还可以决定当它们访问此范围之外时要执行的操作。
for(int x=1;x<13;x++)C++代码的索引从<代码> 0代码>开始。看起来这个可怜的代码>新的<代码>丢失了他的<代码>删除<代码>好友(请看这里的另一篇文章,加上使用<代码>向量< /代码>的实现:“索引1到12是可访问的”不,它们不是。超过6的索引超出范围,如果您访问它们,则给出未定义的行为。如果您希望运行时检查索引在范围内,则必须自己提供。C++不自动执行。