我的目标是编写一个函数,将 AccountInfo 类的对象添加到包含 200 个元素的 AccountInfo 对象数组中。该数组开始时没有任何对象。 AccountInfo 类包含几个字段 - 大部分是 char*,还有一些 int。
经过几个小时的尝试,我无法弄清楚出了什么问题。我的代码都符合,但我得到一个异常
Project1.exe 中 0x00A164B0 处的第一次机会异常:0xC0000005:访问冲突写入位置 0x00000000。
在下面一行:
getAccounts()[size()] = AccountInfo(*newUser);
我在保留基本信息的同时尽可能地简化了我的代码。如果提供 AccountInfo 类的代码会有帮助,我也可以这样做。
#include <iostream>
using namespace std;
class AccountInfo
{
private:
char* _userLoginName;
char* _password;
unsigned int _uid;
unsigned int _gid;
char* _gecos;
char* _home;
char* _shell;
public:
//Constructor and Destructor
AccountInfo(char* username);
~AccountInfo();
//Also contains getters and setters.
};
//Method Definitions
AccountInfo::AccountInfo(char* username)
{
//Initialize the username and other mandatory fields.
_userLoginName = username;
_home = "/", "h", "o", "m", "e", "/", username;
_shell = "/bin/bash";
}
AccountInfo::~AccountInfo()
{
//Delete dynamically created fields.
delete _userLoginName;
delete _password;
delete _gecos;
delete _home;
delete _shell;
}
class UserDB
{
private:
AccountInfo* _accounts[200];
unsigned int _size;
unsigned int _nextUid;
unsigned int _defaultGid;
AccountInfo* getAccounts();
public:
UserDB();
~UserDB();
void adduser(AccountInfo* newUser);
int size(); // return the number of accounts stored (_size)
};
AccountInfo* UserDB::getAccounts()
{
return _accounts[200];
}
UserDB::UserDB()
{
_size = 0;
_nextUid = 1001;
_defaultGid = 1001;
}
int UserDB::size()
{
return _size;
}
void UserDB::adduser(AccountInfo* newUser)
{
getAccounts()[size()] = AccountInfo(*newUser);
}
int main() //main method
{
UserDB users;
AccountInfo *x = new AccountInfo("Joe");
//This creates an AccountInfo object with one of its
//char* fields initialized to "Joe".
users.adduser(x);
return 0;
}
我做错了什么?我该如何解决?
最佳答案
您正在创建一个新的临时对象以添加指向:
getAccounts()[size()] = AccountInfo(*newUser);
为什么取消引用 newUser
,只是为了复制构造一个临时的?
你可能想要:
getAccounts()[size()] = newUser;
此外,size
不是该函数的好名称 - 它听起来好像您每次都在索引 N+1
位置。 numAccounts
或类似的可能更合适。
不要忘记增加这个计数器,并检查您是否达到了 200
限制!
此外,通过您添加的代码,我发现您尝试将类型为 char*
的变量设置为 "something"
。您只能在初始化时执行此操作;您的构造函数需要以这种方式在初始化列表中设置 _shell
等,而不是在构造函数主体中:
AccountInfo::AccountInfo(char* newUser) : _shell("/bin/bash") {/**/}
关于C++难以将对象添加到数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28206197/