创建对象矢量

时间:2015-10-23 15:07:17

标签: c++

vector <Population> obj;

int num_of_cities = 0;

cout<<"Enter the number of cities"<<endl;
cin>>num_of_cities;

for( int x = 0; x < num_of_cities ; x++)
{
    cout<<"Enter population for city #"<< x + 1 <<endl;
    cin>>populate;
    obj[x].setPopulation(populate);
.....

我试图制作一个对象矢量。基本上用户将输入城市数量,程序应为每个城市创建一个对象。这样就可以输入每个城市的信息。我相信语法有问题,因为一旦我为populate设置了一个值,程序就会崩溃。任何人都可以帮忙吗?

4 个答案:

答案 0 :(得分:2)

以下问题是:

obj[x].setPopulation(populate);

您正尝试访问索引为x的对象,但您的vector实际上是为空

要解决这个问题,有两种解决方案:

  • 您应该在每次循环迭代时为Population创建一个push_back对象和vector

示例:

//...    
for( int x = 0; x < num_of_cities ; x++)
{
    cout<<"Enter population for city #"<< x + 1 <<endl;
    cin>>populate;
    Population pop;
    pop.setPopulation(populate)
    obj.push_back(pop);
}
//...
  • 或者,只有在您知道城市数量时,才会使用尺寸初始化vectorvector <Population> obj (num_of_cities);

示例:

//...
cin>>num_of_cities;
vector <Population> obj (num_of_cities); // move your vector declaration here
for( int x = 0; x < num_of_cities ; x++)
//...

答案 1 :(得分:1)

obj[x].setPopulation(populate);

这里你试图访问一个越界的元素,因为向量obj还没有内容。

实现这项工作的方法是致电

obj.resize(num_of_cities) 
在for循环之前

。 一个更通用的方法(如果你事先不知道你将拥有多少个元素,但在这种情况下哪个元素会更慢),那么它将创建一个Population对象,然后将其推送到向量: / p>

Population p;
p.setPopulation(populate);
obj.push_back(p);

答案 2 :(得分:0)

以下代码将允许您创建城市对象的向量,然后可以使用有意义的数据填充这些对象。首先,您需要定义一个可以设置和获取各种数据项的City类。代码将编译并运行,但它是您可能想要完成的有限版本。

#include<iostream>
#include<vector>
#include<string>

using namespace std;

class City {
public:
    City() {}
    ~City() {}
    void setPopulation(int& pop) { m_pop = pop; }
    int getPopulation() const { return m_pop; }
    void setName(const string& name) { m_name = name; }
    string getName() const { return m_name; }
private:
    string m_name{ "" };
    int m_pop{ 0 };
};

vector<City> cities(0);

int num_of_cities = 0;

int main() {

    do {
        cout << "Enter number of cities: ";
        cin >> num_of_cities;
    } while (num_of_cities < 1);

    cities.resize(num_of_cities);

    int val{ 0 };
    string nam{ "" };
    for (int i = 0; i < cities.size(); i++) {
        cout << "Enter name of city: ";
        cin >> nam;
        cities[i].setName(nam);
        cout << "Enter population for city: ";
        cin >> val;
        cities[i].setPopulation(val);
    }

    system("pause");
    return 0;
}

答案 3 :(得分:0)

虽然当前可用的答案正确地识别了当前问题的根源 - 访问空向量 - 但它们未能在给定方案中设置使用向量的正确示例。它们或者建议对预构造对象进行push_back - 因此不必要地调用复制构造函数 - 或者要求存在默认构造函数,并且具有exra赋值的副作用。

最优雅的解决方案是:

确保您的Population有一个构造函数,它接受种群大小并相应地设置内部成员(可能是const int):

Population::Population(int habitants) : habitants(habitants) { }

然后,使用emplace_back插入一个对象而不调用任何其他构造函数:

obj.emplace_back(populate);