Как объявить объекты во время итерации - PullRequest
0 голосов
/ 29 ноября 2018

Я прошу прощения за вопрос, который кажется действительно пешеходным вопросом, но я изучал тему в течение нескольких дней, не в состоянии найти ответ.Предположим, у меня есть файл со строками, связанными с информацией о пользователях, что-то вроде:

Roberts John 25
Peters Kelly 22

И я хочу сохранить каждую строку как объект (структуры), а затем сохранить указатели на эти объекты в векторе,не зная, сколько строк ожидать.Обозначение, которое я знаю для создания объекта (допустим, структура называется «Пользователь», а вектор называется «Пользователи»)

User Roberts;
Roberts.age = 25;
...
Users.push_back(&Roberts)

Вместо того, чтобы сказать «создайте объект с именем« Робертс »и передайте ему эти значения«как мне сказать« создать объект и дать ему эти значения »?

Я понимаю, что для моего примера у меня нет реальной причины использовать структуру, но моя реальная цель более сложна, поэтому япредоставлен только простой пример, иллюстрирующий проблему.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Вы не должны использовать указатели вообще.Просто используйте вектор объектов:

struct User
{
    std::string first_name;
    std::string last_name;
    int age;
};

int main()
{
    std::vector<User> users;
    std::ifstream ifs("YourFile.txt");
    User user;
    while (ifs >> user.first_name &&
           ifs >> user.last_name &&
           ifs >> user.name) {
        users.push_back(std::move(user));
    }
}

Если вы действительно, действительно хотите использовать указатели, вам нужно разместить объект в бесплатном хранилище, чтобы указатели на него оставались действительными после его выходаof scope:

struct User
{
    std::string first_name;
    std::string last_name;
    int age;
};

int main()
{
    std::vector<std::unique_ptr<User>> users;
    std::ifstream ifs("YourFile.txt");
    std::string line;
    while (std::getline(ifs, line)) {
        std::unique_ptr<User> user = std::make_unique<User>();
        std::istringstream iss(line);
        iss >> user->first_name;
        iss >> user->last_name;
        iss >> user->age;
        users.push_back(std::move(user));
    }
}

Объекты, размещенные в бесплатном хранилище, должны быть явно удалены, когда вы закончите с ними.Я использовал std::unique_ptr для обработки этого удаления.Если бы вы использовали необработанные указатели, вы должны были бы убедиться, что delete каждый объект перед тем, как вектор, содержащий указатели на них, выйдет из области видимости.

0 голосов
/ 29 ноября 2018
vector<User> Users; // Save the object not the pointer.
for(int i = 1; i < 10; i++)
{
    User user;
    user.age = i;
    Users.push_back(user); // A clone of user will be pushed into the vector.
}
...