为什么我的序列构造函数无法正常工作?

时间:2019-02-20 21:19:47

标签: c++ constructor sequence

我目前正在C ++中的一个项目上,我必须创建一个序列然后对其执行功能。但是,我的构造函数遇到了一个问题,我无法理解它的问题所在。不会创建新序列。我正在使用数组来实现我的序列。另外,我认为问题也可能与我的insert()函数有关。

这是我的构造函数:

Sequence::Sequence(size_type sz)
{
    numElts = sz;
    elts = new int[sz];
}

这是我的插入函数:

void Sequence::insert(size_type position, value_type value)
{
    for (int i = 0; i <= numElts; i++) {
        elts[i];

        if (i = position) {
            elts[i] = value;
        }
    } 
}

1 个答案:

答案 0 :(得分:0)

您的构造函数可以很好地分配数组(不过,请确保您的类的其余部分正确实现了Rule of 3/5/0),但是它没有使用任何初始值填充数组。

另一方面,您的insert()有几个问题:

  • 它正在遍历1个太多的元素。数组的索引为0,这意味着有效索引将为0..sz-1,因此您需要在循环中使用<而不是<=

  • elts[i];并没有真正有意义的事情。它只是从数组中读取一个值(在inumElts相同的情况下,它将越过数组的末尾读取到周围的内存中),但是它什么也没做具有该值。

  • if (i = position) position的值分配给i,然后评估该分配的结果( i的新值)作为布尔表达式。因此,如果position为0,则因为0的计算结果为false,所以什么都不会发生,但是其他任何值的计算结果都为true,并且每次循环迭代(包括上述1个错误的迭代)都将value分配给position指定的数组索引,它本身可以超出数组的范围,因为您没有对其进行验证。要将i的原始值与position的值进行比较,您需要使用==比较操作而不是=赋值运算符。

请尝试以下类似操作:

Sequence::Sequence(size_type sz)
{
    numElts = sz;
    elts = new int[sz];
    // or: elts = new int[sz]();

    for (size_type i = 0; i < sz; ++i) {
        elts[i] = 0;
    }
    // or: std::fill(elts, elts + sz, 0);
    // or: std::fill_n(elts, sz, 0);
}

void Sequence::insert(size_type position, value_type value)
{
    for (size_type i = 0; i < numElts; ++i) {
        if (i == position) {
            elts[i] = value;
            break;
        }
    }
}

但是,insert()可以通过完全删除循环来大大简化:

void Sequence::insert(size_type position, value_type value)
{
    // NOTE: checking for '>= 0' can be skipped if size_type is unsigned ...
    if ((position >= 0) && (position < numElts)) {
        elts[position] = value;
    } 
}