C Создание массива объектов

#c #arrays #object

Вопрос:

У меня возникла проблема с созданием одного массива из 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 сотрудников и ввода(имя, идентификатор). например, в EmployeeInfo[0], первый сотрудник, я хочу ввести «Том Джонс», «123456»
, а в employee[1], второй сотрудник, «Джеймс Блит», «QE123»

Комментарии:

1. Знакомы ли вы с понятиями конструктора и неявно объявленного конструктора по умолчанию

2. @KarenBaghdasaryan да, но не сильно

3. @David___S__ Как бы вы инициализировали один employeeInfo , не говоря уже о множестве из них? Вы, кажется, пропустили основную концепцию конструкторов.

4. Знакомы ли вы в целом с массивами? employeeInfo[0] будет первым employee в массиве, employeeInfo[1] будет вторым и т. Д. На самом деле нет ничего особенного в том, что это массив employee объектов, а не массив int s или float s или что-то в этом роде.

5. Так, например, вы могли бы позвонить employeeInfo[0].setName("Tom Jones"); , чтобы установить имя первого employee в массиве на «Том Джонс» и employeeInfo[1].setIDnumber("QE123")

Ответ №1:

Вы можете просто вызвать методы сеттера для отдельных employee объектов, например:

 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() = defau<
    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(amp;employeeInfo[0]) employee("Tom Jones", "123456");
    new(amp;employeeInfo[1]) employee("James Blyth", "QE123");
    // and so on...

    ...

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

Или вы можете использовать a 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...

    ...
}