2015-10-23 2 views
-3
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); 
..... 

Im пытается создать вектор объектов. В основном пользователь будет вводить количество городов, и программа должна создать объект для каждого города. Таким образом, можно ввести информацию о каждом городе. Я считаю, что есть проблема с синтаксисом, потому что, как только я ставлю значение для заполнения, программа выйдет из строя. Любой может помочь?Создание вектора объектов

+1

Пожалуйста ** [править] ** ваш вопрос с [mcve] или [SSCCE (Short, самодостаточно, Правильный пример)] (http://sscce.org) – NathanOliver

+1

'obj' - это« вектор »без содержимого, поэтому' obj [x] 'обращается за пределы. Как правило, вы будете 'push_back' объектом' Population' или 'resize', чтобы у' vector' было столько элементов (которые были бы построены по умолчанию) перед использованием индексации массива. – crashmstr

+1

* «Я пытаюсь создать вектор объектов. *» - В C++ каждый вектор является вектором объектов, потому что в C++ даже экземпляры примитивных типов называются «объектами». Правильная формулировка будет «вектором объектов пользовательского типа». –

ответ

2

Следующая строка проблема:

obj[x].setPopulation(populate); 

Вы пытаетесь получить доступ к объекту по индексу x, но ваш vector фактически пустой.

Чтобы решить эту проблему, есть 2 решения:

  • Вы должны создать 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++) 
//... 
+0

В первом примере есть дополнительная копия и повреждение. Второй предполагает, что существует конструктор по умолчанию. – SergeyA

+0

@SergeyA Да, это минус первого решения –

+0

Тем не менее, есть решение elgant, свободное от недостатков обоих. – SergeyA

1
obj[x].setPopulation(populate); 

здесь вы пытаетесь получить доступ к элементу, который вне переплете, так как vector obj не имеет еще комментариев.

Способ сделать эту работу было бы назвать

obj.resize(num_of_cities) 

перед для цикла. Более общий подход (который будет работать, если вы не знаете заранее, сколько элементов вы будете иметь, но медленнее, в данном случае), было бы создание Population объекта, а затем толкая его к вектору:

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

Спасибо! Большое спасибо –

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; 
} 
+0

Спасибо за помощь! –

0

Хотя имеющиеся в настоящее время отвечает правильно определить источник проблемы под руку - доступ к пустому вектору - они не установить правильный пример использования вектора в данном сценарии. Они либо предлагают push_back предварительно сконструированного объекта, поэтому без необходимости ссылаются на copy-construcor, либо требуют наличия конструктора по умолчанию с побочным эффектом назначения exra.

Самое элегантное решение будет следующее:

Убедитесь, что население имеет конструктор, который принимает размер населения и устанавливает внутренний элемент соответственно (вероятно, быть константной Int):

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

Чем, использование emplace_back вставить объект, не вызывая каких-либо других конструкторов:

obj.emplace_back(populate); 
+0

Спасибо! Я ценю помощь –