【问题标题】:C++ Trouble adding objects to a listC++ 将对象添加到列表时遇到问题
【发布时间】:2023-03-23 18:50:01
【问题描述】:

我在将对象添加到列表时遇到问题。

我想制作一个人员列表,我知道列表的大小固定为 5 人。 每个人都有一个年龄(int)和一个性别(字符串)。 我想将 Persons 添加到列表中,但我不知道如何,我现在只使用整数。

以下是我目前所拥有的。 随机的年龄和性别是有效的,无论多么笨拙。 我在想而不是像我那样创建 Persons,也许我应该以某种方式在 for 循环中动态创建它们,这会以某种方式生成每次循环迭代的年龄和性别?也许列表应该是指向 Person 对象的指针。

#include <iostream>
#include <list>
#include <memory>

using namespace std;

class Person {
private:
    const int OLDEST_AGE = 100;
    const int YOUNGEST_AGE = 1;
    int age;
    string gender;
public:
    Person()
    {
        age = generateAge();
        gender = generateGender();
    }
    // Person: generate random age for Person, from 1-100
    int generateAge() {
        int randomAge;
        randomAge = rand() % (OLDEST_AGE - YOUNGEST_AGE + 1) + YOUNGEST_AGE;
        return randomAge;
    };
    // Person: generate random gender for Person, Male or Female
    string generateGender() {
        int genderNumber;
        genderNumber = rand() % (1 - 0 + 1) + 0;
        if (genderNumber == 1)
            return "Male";
        else
            return "Female";
    };
    void getStats() {
        cout << "Person Age: " << age << endl;
        cout << "Person Gender: " << gender << endl;
    };
};
int main()
{
    Person P1, P2, P3, P4, P5;
    // Just to see if the objects are created
    P1.getStats();
    P2.getStats();
    P3.getStats();
    P4.getStats();
    P5.getStats();

    list<Person> myList;
    list<Person>::iterator IT;

    for (int i = 1; i <= 5; i++)
        //don't know how to add each Person to the list
        myList.push_back(P1);

    cout << "myList contains: ";
    for (IT = myList.begin(); IT != myList.end(); IT++)
        // similar to above, how do I get the list to print each object's stats
        P1.getStats();
    cout << endl;

    return 0;
}

【问题讨论】:

  • 提示 -- 如果你有 1000 个 Person,你会声明 1000 个单独的变量,命名为 P1P2P3 等一直到 P1000 ?当然不是。那么你会怎么做呢?
  • 嗯我想我会做一个 for 循环,int i = 1 和 i myList 我似乎会用 i++ 做 myList.push_back(i),我不知道如何为一个人做这件事。我确实看到了创建每个对象的速度和内存密集程度。
  • 我猜你没学过std::vectorstd::array这样的数组和容器。为什么不简单地Person P[5];

标签: c++ list


【解决方案1】:

如果您想像另一个response 中指定的那样将许多元素一个接一个地添加到另一个比较列表和向量的问题中,那么在您的情况下使用向量会更好。

回到问题,正如一些 cmets 所指出的,为每个人声明一个变量并不是一个好习惯。你可以做的是用这样的循环填充你的列表:

for(int i = 0; i < 5; i++)
    myList.push_back(Person());

然后要访问对象,您只需在需要的任何地方再次遍历列表。

for(int i = 0; i < 5; i++)
    myList[i].getStats();

【讨论】:

    【解决方案2】:

    您可以创建一个向量,然后运行一个循环来实例化人,然后将它们推入向量中。这样,您就不需要创建单独的人员变量,例如 p1、p2 等,并且您的向量将包含所有“人员”对象。

    vector<Person> people;
    for (int i = 0; i < 5; i++) {
        people.push_back(Person());
    }
    
    for (Person person : people) {
        person.getStats();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2012-10-31
      • 2019-12-03
      • 2011-06-10
      • 2014-03-23
      相关资源
      最近更新 更多