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