c++ 我可以用一个构造函数创建多个对象吗?[关闭]

ac1kyiln  于 2023-04-08  发布在  其他
关注(0)|答案(1)|浏览(154)

已关闭,该问题需要details or clarity,目前不接受回答。
**想要改进此问题?**通过editing this post添加详细信息并澄清问题。

2天前关闭。
Improve this question
我试图用一个构造函数创建同一个类的多个对象,但是用户输入了大量的对象。我尝试了很多方法,但是我不知道如何用一个构造函数创建多个不同的对象,因为我不能使用带有对象名称的变量(我试图在for循环中做到这一点)。

void addusr()
{
    int p, age, time, salary;
    string name, surname, position;
    cout << "Input amount of workers to add: ";
    cin >> p;
    vector<Worker> workers;
    for (int i = 1; i <= p; i++)
    {
        cout << "Worker number: " << i+1 << endl;
        cout << "Name: ";
        cin >> name;
        cout << "Surname: ";
        cin >> surname;
        cout << "Position: ";
        cin >> position;
        cout << "age: ";
        cin >> age;
        cout << "Time: ";
        cin >> time;
        cout << "salary: ";
        cin >> salary;
        workers.push_back(Worker(name, surname, position, age, time, salary));
    }

这是一个类:

#include<string>

using namespace std;

class Worker
{
    public:
        string name;
        string surname;
        string position;
        //SETTERY -------------------------------------------------------------------------------------------------------
        void setAge(int _age);
        void setTime(int _time);
        void setSalary(int _salary);
        //GETTERY--------------------------------------------------------------------------------------------------------
        int getAge();
        int getTime();
        int getSalary();
        Worker(string name, string surname, string position, int age, int time, int salary);
    private:
        int age;
        int time;
        int salary;
};

和构造器:

#include "Worker.h"

void Worker::setAge(int _age)
{
    age = _age;
}

void Worker::setTime(int _time)
{
    time = _time;
}

void Worker::setSalary(int _salary)
{
    salary = _salary;
}

//GETTERY ------------------------------------

int Worker::getAge()
{
    return age;
}

int Worker::getTime()
{
    return time;
}

int Worker::getSalary()
{
    return salary;
}

Worker::Worker(string _name, string _surname, string _position, int _age, int _time, int _salary)
{
    string name = _name;
    string surname = _surname;
    string position = _position;
    int age = _age;
    int time = _time;
    int salary = _salary;
}
t40tm48m

t40tm48m1#

您所展示的代码创建了用户指定数量的Worker对象,正如预期的那样。
然而,你的Worker()构造函数是有缺陷的,因为它将输入值赋给了 * 局部变量 * 而不是 * 类成员 *,所以你创建的每个Worker对象最终都会持有空的/未初始化的字段值。你可以通过 either 来解决这个问题:

  • 删除赋值中的数据类型,这样你就不再声明新的变量,只赋值给现有的变量:
Worker::Worker(string _name, string _surname, string _position, int _age, int _time, int _salary)
{
    name = _name;
    surname = _surname;
    position = _position;
    age = _age;
    time = _time;
    salary = _salary;
}
Worker::Worker(string _name, string _surname, string _position, int _age, int _time, int _salary)
    : name(_name),
      surname(_surname),
      position(_position),
      age(_age),
      time(_time),
      salary(_salary)
{
}

另外,请注意,循环中的Worker number:输出消息显示了错误的数字(它将第一个worker显示为2,而不是1,等等)。您可以通过 either 来解决这个问题:

  • 将循环从以下位置更改:

for (int i = 1; i <= p; i++)
致:
for (int i = 0; i < p; i++)

  • 或者,在输出消息中将i+1更改为i

最后,虽然workers.push_back(Worker(...));可以工作,但它创建了一个 temporaryWorker对象传递给vector,然后vector存储该对象的 * 副本 *。如果使用workers.emplace_back(),它将直接在vector中构造一个新的Worker对象,避免临时和副本,例如:

workers.emplace_back(name, surname, position, age, time, salary);

相关问题