C++难以将对象添加到数组

标签 c++ arrays

我的目标是编写一个函数,将 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/

相关文章:

c++ - 将鼠标事件发送到虚拟现实 OpenGL 场景中的 QtQuick 窗口

c++ - Qt5 Qml 改变TableView高亮颜色

python - 如何在 C++ 中高效地创建和编译大 map

c# - 与嵌入式动态分配数组的托管/非托管类型组合无效

java - 如何将从 Controller 类返回的 JSON 数组打印到 jsp 页面

javascript - 比较 Javascript 中的可变大小对象

c++ - 为什么数组形式参数总是隐式转换为指针而不是被禁止?

c++ - 在 C++ 的构造函数中初始化 c 数组时出错

ios - swift3 append 函数在 firebase observeSingleEvent 内部不起作用

ios - 创建一个有默认值的数组,但是默认值被改变了