C++深拷贝实现报错:invalid conversion from 'int' to 'int*' [-fpermissive]
问题分析与解决
错误原因
编译错误invalid conversion from 'int' to 'int*'的核心问题是:类成员deep是int类型指针,而你在普通构造函数里直接把int值c赋值给它,这属于类型不兼容——指针需要存储内存地址,而非原始数值。你尝试的强制类型转换(int)c只是把c转成int,本质还是给指针赋值数值,完全没解决问题。
修正方案
需要在普通构造函数中用new在堆上分配内存,把c的值存入这块内存,再让deep指向该地址。另外还要修正拷贝构造函数的参数为const引用(符合C++规范,也能接收const对象),同时建议补充赋值运算符重载避免潜在的浅拷贝问题。
修正后的完整代码
#include <iostream> class Simple { private: int data_one, data_two; int *deep; public: // 普通构造函数:在堆上分配内存并初始化值 Simple(int a, int b, int c) : data_one(a), data_two(b) { deep = new int(c); } // 拷贝构造函数:深拷贝堆内存数据,参数改为const引用 Simple(const Simple &dummy) : data_one(dummy.data_one), data_two(dummy.data_two) { deep = new int(*(dummy.deep)); } // 补充赋值运算符重载(避免赋值操作时的浅拷贝问题) Simple& operator=(const Simple &other) { if (this != &other) { // 防止自赋值导致的内存泄漏 data_one = other.data_one; data_two = other.data_two; // 先释放当前对象的堆内存,再分配新内存拷贝值 delete deep; deep = new int(*(other.deep)); } return *this; } ~Simple() { delete deep; } void Display() { std::cout << data_one << ", " << data_two << ", " << *deep << "\n"; } }; int main() { int one = 3; int two = 4; int three = 5; Simple obj1(one, two, three); Simple obj2 = obj1; obj1.Display(); obj2.Display(); }
关键修改点
- 普通构造函数:将
deep = int(c);改为deep = new int(c);,通过new在堆上创建int对象并初始化值为c,返回的内存地址赋值给deep指针,解决类型不匹配问题。 - 拷贝构造函数:参数从
Simple &dummy改为const Simple &dummy,符合C++拷贝构造函数的标准写法,允许拷贝const修饰的对象。 - 补充赋值运算符重载:如果后续代码中出现
obj2 = obj1;这类赋值操作,默认的赋值运算符会执行浅拷贝,导致两个对象的deep指向同一块堆内存,最终触发重复释放的错误。补充重载后可以避免该问题。
内容的提问来源于stack exchange,提问作者Oatman
相关产品推荐
相关产品推荐

