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设置了一个值,程序就会崩溃。任何人都可以帮忙吗?
答案 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);
}
//...
vector
:vector <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);