如何修正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,提问作者고건원
相关产品推荐
相关产品推荐

