Вектор не создает несколько объектов класса - PullRequest
0 голосов
/ 16 марта 2019

У меня есть vector, в котором хранится несколько class object с для последующего доступа. Таким образом, моя программа может создавать новые object во время выполнения. Это делается так:

vector<Person> peopleVector;
peopleVector.push_back(Person(name, age));
for (int i = 0; i < peopleVector.size(); i++) {
    cout << peopleVector[i].name << endl;
}

Эта функция должна печатать каждое object имя "каждый раз, когда выполняется код (это функция, которая запускается несколько раз). Однако, когда я запускаю это, каким-то образом vector не увеличивается в размере. Если вы добавите cout << peopleVector.size(); к этому коду, вы обнаружите, что каждый раз, когда он запускается, он получает один (очевидно, при условии, что у вас также есть код class, который у меня есть ниже).

Мне любопытно, почему я не могу создать несколько object с в классе.

Class.h

#pragma once
#include <iostream>
using namespace std;

class Person {
public:
    Person(string personName, int personAge);
    string name;
    int age;
};



Person::Person(string personName, int personAge) {
    name = personName;
    age = personAge;
}

main.cpp

#include "Class.h"
#include <random>

int main() {
    // Necessary for random numbers
    srand(time(0));

    string name = names[rand() % 82]; // Array with a lot of names
    int age = 4 + (rand() % 95);
}

// Create a new person
void newPerson(string name, int age) {
    vector<Person> peopleVector;
    peopleVector.push_back(Person(name, age));
    for (int i = 0; i < peopleVector.size(); i++) {
        cout << peopleVector[i].name << endl;
    }
}

К вашему сведению, эти #include могут быть немного неактивными, потому что я вынул этот код из большого раздела, в котором было около 15 включений.

Ответы [ 2 ]

2 голосов
/ 16 марта 2019

Вы создаете пустой вектор каждый раз, когда вызываете функцию newPerson(), а затем добавляете в нее одного человека.

Затем вы отображаете содержимое этого вектора. Что еще он может содержать, кроме одного человека, которого вы добавили?

0 голосов
/ 16 марта 2019

Задача

Каждый раз, когда запускается функция, все локальные переменные внутри функции восстанавливаются в их состоянии по умолчанию. Это означает, что каждый раз, когда вы звоните newPerson, он просто воссоздает peopleVector.

Решение

Есть два решения:

  • Пусть newPerson возьмет ссылку на вектор и добавит его к этому
  • делает peopleVector статическим, чтобы он не инициализировался каждый раз

Первое решение:

// Create a new person; add it to peopleVector
// The function takes a reference to the vector you want to add it to
void newPerson(string name, int age, vector<Person>& peopleVector) {
    peopleVector.push_back(Person(name, age));
    for (int i = 0; i < peopleVector.size(); i++) {
        cout << peopleVector[i].name << endl;
    }
}

Второе решение: пометить peopleVector как static

// create a new person; add it to peopleVector
void newPerson(string name, int age) {
    // Marking peopleVector as static prevents it from being re-initialized
    static vector<Person> peopleVector; 
    peopleVector.push_back(Person(name, age));
    for (int i = 0; i < peopleVector.size(); i++) {
        cout << peopleVector[i].name << endl;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...