#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...
...
}