You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修正C++ IntArray类代码,实现指定位置元素修改?

问题分析与代码修正

你的代码存在两个核心问题,导致无法实现预期功能:

1. set函数逻辑完全错误

当前的set函数只是交换了两个参数的局部变量值,完全没有对类内的数组进行任何修改,自然不会改变数组元素。另外代码里还存在语法错误:int temp = x末尾缺少分号。

2. 缺少自定义拷贝构造函数(隐含风险)

用IntArray a2{a1}初始化对象时,默认拷贝构造函数会执行浅拷贝,导致a1和a2的m_data指针指向同一块内存区域。虽然这不是当前输出错误的直接原因,但后续操作(比如销毁对象)会触发重复释放内存的未定义行为。


修正后的完整代码

#include <iostream>
using namespace std;

class IntArray {
private:
    int* m_data;
    int m_len;
public:
    IntArray(int = 0, int = 0);
    // 添加自定义拷贝构造函数,实现深拷贝
    IntArray(const IntArray& other);
    ~IntArray();
    void print(void);
    
    // 修正set函数:将指定位置(1-based)的元素设置为目标值
    void set(int pos, int value) {
        // 检查位置合法性,避免越界访问
        if (pos >= 1 && pos <= m_len) {
            m_data[pos - 1] = value;
        }
    }
};

IntArray::IntArray(int size, int init) {
    if (size <= 0) {
        m_data = nullptr;
        m_len = 0;
    }
    else {
        m_data = new int[size];
        m_len = size;
        for (int idx = 0; idx < m_len; ++idx)
            *(m_data + idx) = init;
    }
}

// 实现深拷贝的拷贝构造函数
IntArray::IntArray(const IntArray& other) {
    m_len = other.m_len;
    if (m_len > 0) {
        m_data = new int[m_len];
        for (int idx = 0; idx < m_len; ++idx) {
            m_data[idx] = other.m_data[idx];
        }
    } else {
        m_data = nullptr;
    }
}

IntArray::~IntArray() {
    delete[] m_data;
}

void IntArray::print(void) {
    for (int idx = 0; idx < m_len; ++idx)
        cout << *(m_data + idx) << ' ';
    cout << endl;
}

int main() {
    cout << "a1: ";
    IntArray a1{10, 100};
    a1.print();
    cout << "a2: ";
    IntArray a2{a1};
    a2.set(3, 999);
    a2.set(9, 123);
    a2.print();
    return 0;
}

修正后的输出

a1: 100 100 100 100 100 100 100 100 100 100 
a2: 100 100 999 100 100 100 100 100 123 100 

(注:如果你的预期是第3个位置(0-based索引2)为999、第9个位置(0-based索引8)为123,上面的输出完全符合;若你是指0-based的第3和第9位,只需将set函数中的pos-1改为pos即可。)

内容的提问来源于stack exchange,提问作者고건원

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 06:01:08