Как выделить массив объектов класса

0

Я определил класс под названием HPC_user следующим образом:

#include <iostream.h>
#include <string>

using std::string;

class HPC_user
{
  public:
    HPC_user(std::string firstName, std::string lastName, std::string login, std::string school, double activity);
    ~HPC_user();

    std::string get_first() const { return fName; }
    void set_first(std::string first) { fName = first; }

    std::string get_last() const { return lName; }
    void set_last(std::string last) { lName = last; }

    std::string get_login() const { return uId; }
    void set_login(std::string login) { uId = login; }

    std::string get_school() const { return sName; }
    void set_school(std::string school) { sName = school; }

    std::string get_activity() const {return cpuTime; }
    void set_activity(std::string activity) { cpuTime = activity; }

  private:
    std::string fName, lName, uId, sName, cpuTime;
};


HPC_user.cpp
#include "HPC_user.h"

// constructor of HPC_user                                                                                                                                                               

HPC_user::HPC_user(std::string firstName, std::string lastName, std::string login, std::string school, double activity)
{
  fName = firstName;
  lName = lastName;
  uId = login;
  sName = school;
  cpuTime = activity;

  // cout << "new HPC_user created\n";                                                                                                                                                   
}

HPC_user::~HPC_user()   // destructor 

Теперь я хочу выделить массив из 500 объектов HPC_user и сначала установить элементы в NULL или 0.0. Затем присвойте реальные значения в цикле for.

Это то, что я сделал:

  int size = 500;
  HPC_user *users;
  users = new HPC_user(NULL,NULL,NULL,NULL,0.00)[size];

При компиляции я получил ошибку:

db2class.cpp:51:49: error: expected ';' after expression
users = new HPC_user(NULL,NULL,NULL,NULL,0.00)[size];

Каков правильный способ выделения пространства для массива объектов?

Теги:
arrays

2 ответа

1
Лучший ответ

Используйте std::vector:

std::vector<HPC_user> users(size, HPC_user(NULL,NULL,NULL,NULL,0.00));

Но это немедленно сработает, потому что инициализация std::string из нулевого указателя является ошибкой. Поэтому вам нужно исправить аргументы конструктора как нечто разумное или предоставить разумный конструктор по умолчанию

 HPC_user() : activity(0.0) {} // strings get default constructed to ""

и делай

std::vector<HPC_user> users(size);
  • 0
    @ Jarod42 Хорошо, спасибо!
  • 0
    Спасибо, в чем преимущество того, чтобы он был вектором, а не массивом?
Показать ещё 4 комментария
1

Если вы считаете, что ваш HPC_user имеет разумный по умолчанию, добавьте конструктор по умолчанию к этому классу:

HPC_user::HPC_user()
   : cpuTime( 0.0 )
{
}

Затем вы можете построить вектор 500 HPC_user:

std::vector< HPC_user > users( 500 );

И вы должны использовать синтаксис инициализации, когда вы инициализируете данные, нет настройки:

HPC_user::HPC_user(std::string firstName, std::string lastName, std::string login, std::string school, double activity)
  : fName( firstName )
  , lName( lastName )
  , uId( login )
  , sName( school )
  , cpuTime( activity )
{
}
  • 0
    Могу ли я сделать это в моем объявлении класса HPC_user? HPC_user (std :: string firstName = "", std :: string lastName = "", std :: string login = "", std :: string school = "", двойная активность = 0.0);
  • 0
    Да. Вы можете, но вы действительно не должны этого делать, потому что это вызывает много накладных расходов на вызывающей стороне. Я пропустил, что cpuTime является двойным, в этом случае он должен быть инициализирован. Для строки у них есть разумные конструкторы по умолчанию.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню