【问题标题】:C++ Creating Array of ObjectsC++ 创建对象数组
【发布时间】:2021-10-21 13:51:31
【问题描述】:

我在创建一个包含 3 个对象的数组时遇到问题。我正在尝试显示员工的信息,我的问题是我不知道将字符串分配给适当的成员的位置以及如何保留一个变量作为名称。我的代码和示例如下:

class employee
{
private:                
    string name;
    string idNumber;

public:                 
    void setName(string);
    void setIDnumber(string);
    string getName();
    string getIDnumber();

};

const int numEmployees = 3;

int main()
{

    employee employeeInfo [numEmployees];
}

我想为 3 名员工和 input(name, idNumber) 创建一个构造函数。例如,在第一个员工employeeInfo[0]中,我想输入“Tom Jones”、“123456” 在雇员[1]中,第二名雇员,“James Blyth”,“QE123”

【问题讨论】:

  • @KarenBaghdasaryan 是的,但不多
  • @David___S__ 您将如何初始化单个 employeeInfo,更不用说它们的数组了?您似乎跳过了构造函数的基本概念。
  • 您对数组是否熟悉? employeeInfo[0] 将是数组中的第一个 employeeemployeeInfo[1] 将是第二个,依此类推。与 ints 或floats 什么的。
  • 例如,您可以调用employeeInfo[0].setName("Tom Jones"); 将数组中第一个employee 的名称设置为“Tom Jones”和employeeInfo[1].setIDnumber("QE123")

标签: c++ arrays object


【解决方案1】:

您可以简单地调用单个 employee 对象的 setter 方法,例如:

int main()
{
    employee employeeInfo [numEmployees];

    employeeInfo[0].setName("Tom Jones");
    employeeInfo[0].setIDNumber("123456");

    employeeInfo[1].setName("James Blyth");
    employeeInfo[1].setIDNumber("QE123");

    // and so on...

    ...
}

如果你真的想添加一个构造函数,那么它应该是这样的:

class employee
{
private:                
    string name;
    string idNumber;

public:                 
    employee() = default;
    employee(string name, string idNumber);

    ...
};

employee::employee(string name, string idNumber) {
    setName(name);
    setIDnumber(idNumber);
};

...
int main()
{
    employee employeeInfo [numEmployees];

    employeeInfo[0] = employee("Tom Jones", "123456");
    employeeInfo[1] = employee("James Blyth", "QE123");
    // and so on...
}

请注意,这将默认-先构造数组元素,然后构造临时对象以覆盖数组元素。

如果你想避免使用临时对象,但仍然希望连续存储一个固定的对象数组,你可以使用placement-new 直接使用非默认构造函数构造数组成员,例如:

#include <type_traits>

int main()
{
    std::aligned_storage_t<sizeof(employee), alignas(employee)> buffer[numEmployees];
    employee* employeeInfo = reinterpret_cast<employee*>(buffer);

    new(&employeeInfo[0]) employee("Tom Jones", "123456");
    new(&employeeInfo[1]) employee("James Blyth", "QE123");
    // and so on...

    ...

    for(int i = 0; i < numEmployees; ++i) {
        employeeInfo[i].~employee();
    }
}

或者,您可以使用std::vector(如果您不介意将数组分配在动态内存中),例如:

#include <vector>

int main()
{
    std::vector<employee> employeeInfo;
    employeeInfo.reserve(numEmployees);

    employeeInfo.emplace("Tom Jones", "123456");
    employeeInfo.emplace("James Blyth", "QE123");
    // and so on...

    ...
}

否则,改为创建一个指向对象的指针数组,然后您可以使用new 和非默认构造函数动态创建各个对象。对象不会连续存储在内存中,例如:

int main()
{
    employee* employeeInfo[numEmployees];

    employeeInfo[0] = new employee("Tom Jones", "123456");
    employeeInfo[1] = new employee("James Blyth", "QE123");
    // and so on...

    ...

    for(int i = 0; i < numEmployees; ++i) {
        delete employeeInfo[i];
    }
}

使用std::unique_ptr 处理会更安全,例如:

#include <memory>

int main()
{
    std::unique_ptr<employee> employeeInfo[numEmployees];

    employeeInfo[0] = std::make_unique<employee>("Tom Jones", "123456");
    employeeInfo[1] = std::make_unique<employee>("James Blyth", "QE123");
    // and so on...

    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多