2015-01-29 3 views
2

Я попытался получить доступ к элементам класса Part, которые являются векторными элементами типа integer внутри вектора tasks.не могут получить доступ к элементам вектора класса

#include <iostream> 
#include <vector> 

using namespace std; 

class Part{ 
    vector<int> tasks; 
    public: 

    void setTasks(void); 
    void getTasks(void); 
}; 
void Part::setTasks(void){ 
    vector<int>::iterator it; 
    int i=1; 
    for (it = this->tasks.begin(); it != this->tasks.end(); ++it) 
    { 
     *it=i; 
     i=i+1; 
    } 
} 

void Part::getTasks(void){ 
    vector<int>::iterator it; 
    for (it = this->tasks.begin(); it != this->tasks.end(); ++it) 
     cout<<*it<<"\t"; 
} 
int main() 
{ 
    Part one; 
    one.setTasks(); 
    one.getTasks(); 

    return 0; 
} 

Я просто пытаюсь получить доступ к значениям и распечатать их, но не удалось. Ошибка компиляции отсутствует. Во время выполнения в терминале ничего не выводится. Где ошибка?

+3

'Задачи' пуст. Вы никогда ничего не вкладывали в это. Таким образом, «setTasks» и «getTasks» ничего не делают. Какой результат вы ожидали? (Сколько предметов?) – Cameron

+1

Ваш вектор пуст. Попробуйте дать ему размер. Например, 'vector tasks (10)'. См. [Вариант 3 в этом] (http://en.cppreference.com/w/cpp/container/vector/vector). –

+0

Если вы хотите что-то вроде массива, но больше C++ y, вы должны взглянуть на 'std :: array'. (BTW, '(void)' - вещь C, в C++ она не нужна или не рекомендуется). – Biffen

ответ

3

по умолчанию построен vector имеет нулевой размер, поэтому for петля в setTasks никогда не поступил (так как begin() и end() итераторы являются одинаковыми в этой точке). Если вы установите начальный размер на vector, ваш код будет работать так, как предполагалось. Например, попробуйте добавить следующую строку в начале setTasks

tasks.resize(10); // sets vector size to 10 elements, each initialized to 0 

Другой способ, чтобы написать эту функцию будет

#include <numeric> 

... 

void Part::setTasks(void){ 
    tasks.resize(10); 
    std::iota(tasks.begin(), tasks.end(), 1); // requires C++11 
} 

Вы также можете установить начальный размер vector в значение по умолчанию конструктор Part, если хотите. В этом случае добавьте следующий открытый конструктор

Part() : tasks(10) 
{} 

Еще один способ добиться установления размера при строительстве будет

class Part{ 
    vector<int> tasks = vector<int>(10); // requires C++11 
+0

Почему бы просто не использовать конструктор по умолчанию? – 0x499602D2

+1

@ 0x499602D2 Вы имеете в виду задание начального размера внутри конструктора? Конечно, вы могли бы, я предположил, что OP хочет, чтобы размер 'vector' устанавливался только при вызове' setTasks'. – Praetorian

+0

@Praetorian И в случае, если вы не уверены, сколько места он хочет выделить, чтобы уклониться от риска сокращения или увеличения размера, 'push_back' идеально, не так ли? Я прошу об этом для подтверждения bcuz, о котором не упоминалось. – userzizzy

1

Размер вашего вектора 0 при звонке setTasks(). Ваш итератор вообще не попадает в цикл for. Вам нужно подумать о том, что именно вы хотите делать setTasks(). Сколько элементов вектора вы сделали intend установить? Вы должны либо определить свой вектор с этим размером, либо использовать это множество чисел push_back s, чтобы установить вектор в нужное значение.

0

Ваш вектор пуст. Попробуйте дать ему размер. Например, vector<int> tasks(10). См. option 3 in this.

0

В качестве альтернативы, вы можете использовать «обратную вставку» итератор (#include <iterator>), который внутренне вызывает std::vector::push_back, как это:

void Part::setTasks(void){ 
    auto back_it = std::back_inserter(tasks); 
    for(int i = 0; i < 10; ++i) 
     *back_it++ = i; 
} 

Этот вид итератора особенно полезен в алгоритмах, где конечный пункт s ize неизвестен. Хотя, если вы знаете размер заранее, вы должны использовать reserve/resize или указать размер при строительстве, так как отталкивание назад в вектор иногда может быть медленным из-за перераспределения.

Смежные вопросы