繁体   English   中英

通过 C++ 中的用户输入动态创建新的 class 对象

[英]Creating new class objects dynamically via user input in C++

我是 C++ 的新手。对于在线 class 中的期末项目,我正在编写一个程序,该程序本质上是一个虚拟时间卡,用于跟踪工作的工作时间。 我为我的代码中的任何明显缺陷道歉,它仍在进行中,这个 class 让我很快接受了很多新概念。

我有一个名为Employee的 class,在那个 class 中我有一个名为newEmployee()的 function,它允许用户注册一个新员工以供程序跟踪。 这是我的 header 文件的一部分:

class Employee {
private:
    std::string Name;
    double Pay;
    bool Admin;

public:
    Employee(std::string& name, double pay, bool admin);
    void getInput();
    void newEmployee();
    void getStatus();
    void clockIn();
    int clockOut();
    int timer();
    int exportTimeSheet();

这是我对构造函数的实现:

Employee::Employee(std::string& name, double pay = 0.0, bool admin = false) {
    Name = name;
    Pay = pay;
    Admin = admin;
}

我遇到的问题是,我不知道如何通过用户输入动态创建新的 class object。 newEmployee() function 要求他们提供员工的姓名 ( string )、他们的薪水 ( double ) 以及他们是否是管理员 ( boolean )。

我熟悉在运行时使用newdelete关键字创建动态变量,但是如果 function 被用户多次调用,我如何将用户输入的字符串解析为 class 构造函数并动态创建多个新的唯一 class对象?

您需要一个 Employee 对象的容器——我建议使用一个 vector

std::vector<Employee> employees;

while (still getting input){
    string name = get from input;
    Employee emp(name,...);
    employees.push_back(emp);
}

或者更好,使用指针(节省大量复制):

std::vector<Employee*> employees;

while (still getting input){
    string name = get from input;
    Employee *emp = new Employee(name,...);
    employees.push_back(emp);
}

这里的缺点是您必须记住释放动态分配的所有 memory。

所以你可以改用智能指针:

using EmployeePtr = std::shared_ptr<Employee>;
std::vector<EmployeePtr> employees;

while (still getting input){
    string name = get from input;
    auto emp = std::make_shared<Employee>(name,...);
    employees.push_back(emp);
}

要获取数据,您可以使用:

 employees[n].Name (#1)
 employees[n]->Name (#2 and #3)

你说newEmployee()提示输入员工信息。 但是它的返回值是一个void ,所以它不能返回一个新的Employee 尝试更像这样的东西:

class Employee {
    ...
    static Employee newEmployee();
    ...
};
Employee Employee::newEmployee() {
    std::string name;
    double pay;
    bool admin;

    // read in values as needed...

    return Employee(name, pay, admin);
}

然后你可以这样做:

Employee emp = Employee::newEmployee();
// use emp as needed...

或者,如果您需要动态创建Employee object:

class Employee {
    ...
    static std::unique_ptr<Employee> newEmployee();
    ...
};
std::unique_ptr<Employee> Employee::newEmployee() {
    std::string name;
    double pay;
    bool admin;

    // read in values as needed...

    return std::make_unique<Employee>(name, pay, admin);
}

然后你可以这样做:

auto emp = Employee::newEmployee();
// use emp as needed...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM