C++开发简易银行系统运行时出现读取访问权限冲突报错
错误根因分析
你当前出现访问冲突报错的核心问题是createuser函数中对类对象地址的强制类型转换、直接操作内存的行为是完全错误的,属于C++中的未定义行为:
- 你自定义的
MyClass类的内存头部是std::string类型的Username成员,你把类对象地址强制转成int*后写入存款数值,相当于直接篡改了std::string内部的内存管理指针,等到函数结束User对象销毁时,std::string的析构函数会尝试访问已经被你篡改的非法地址(也就是报错里的0x6),直接触发内存访问冲突。 - 你两次对
*i赋值,也只会反复覆盖Username成员的内容,Password成员根本没有被正确赋值,完全达不到你想要的写入多个私有成员的效果。 - 更关键的是:你已经在类的public区域写好了
setUsername、setPassword、setMoney三个合法的 setter 接口,完全不需要通过非法的指针操作去修改私有成员。
修复后的代码
把createuser里的指针操作全部删掉,换成调用你自己写的setter方法即可:
#include <iostream> #include <string> #include <vector> void clearscreen(); // 修改createuser参数,接收存储用户的容器引用 int createuser(std::vector<class MyClass>& userList); class MyClass { private: std::string Username; std::string Password; int money = 0; public: void setUsername(std::string x) { Username = x; } void setPassword(std::string y) { Password = y; } void setMoney(int z) { money = z; } }; void clearscreen() { system("cls"); } int main() { std::cout << "Welcome new User!\n" << std::endl; // 新增容器存储所有创建的用户 std::vector<MyClass> allUsers; bool exitprogram = false; while (exitprogram == false) { std::cout << "The Options are:\n"; std::cout << "1. Create User\n" << "2. Login\n" << "3. Exit Program\n" << "\nEnter an option: "; int option = 0; std::cin >> option; switch (option) { case 1: createuser(allUsers); break; case 2: std::cout << "\nThis option is not avalible yet!"; // 新增break,避免直接执行case3逻辑 break; case 3: exitprogram = true; break; } } return 0; } int createuser(std::vector<MyClass>& userList) { clearscreen(); MyClass User; std::cout << "Please enter the correct information!\n" << "Username: "; std::string createusern; std::cin >> createusern; User.setUsername(createusern); std::cout << "\n Password: "; std::string createpasswordn; std::cin >> createpasswordn; User.setPassword(createpasswordn); std::cout << "\nDeposit Money: "; int insertmoney; std::cin >> insertmoney; User.setMoney(insertmoney); // 把创建好的用户存入全局容器,后续登录可读取 userList.push_back(User); std::cout << "\n\n Congratz, You now have a bank accout! \n\n"; clearscreen(); return 0; }
其他优化建议
- 类名
MyClass语义不清晰,建议改成BankAccount或者User这类符合业务含义的名字。 clearscreen函数里的system("cls")是Windows平台特有的实现,如果需要跨平台运行可以加条件编译适配Linux/macOS的clear命令,个人练习使用无需调整。- 后续做登录功能时,还需要给
MyClass补充对应的getter方法,用于读取用户名、密码做校验。
内容的提问来源于stack exchange,提问作者CPPNEWBIE
相关产品推荐
相关产品推荐

