2016-01-25 6 views
0

Я начинаю писать классы и задаю следующий вопрос. Предположим, у меня есть следующий класс:Манипулировать элементами вектора в классе

class foo 
{ 
private: 
    int bar; 
public: 
    foo(int bar): bar(bar){} 
    void set_bar(int ubar){bar=ubar;} 
    int get_bar(){return bar;} 
}; 

Теперь я хочу, чтобы написать класс, который содержит экземпляры foo.

class foo_cont 
{ 
private: 
    vector<foo> foo_vec; 
public: 
    foo_cont(){} 
    void add_element(foo f1){foo_vec.push_back(f1);} 
}; 

Допустим, я делаю instace из foo_cont f1; и заполнить foo_vec его с экземплярами foo. Как изменить элементы foo_vec с помощью set_bar()?

Редактировать: Поскольку я совершенно новый для переполнения стека, это может быть действительно глупый вопрос, но почему я получаю downvotes?

+2

Параметр '' VECTOR' в foo_count' имеет 'бар 'не' foo'. Это опечатка? – NathanOliver

+0

yes Я отредактировал его – PtK

+0

Вы спрашиваете нас, как вызвать функции на элементах, содержащихся внутри вектора? – AndyG

ответ

2

Вы можете определить operator [] для класса foo_cont. Например

class foo_cont 
{ 
private: 
vector<bar> foo_vec; 
public: 
    // ... 
    bar & operator [](size_t i) 
    { 
     return foo_vec[i]; 
    } 
    const bar & operator [](size_t i) const 
    { 
     return foo_vec[i]; 
    } 
}; 

Например

for_cont[i].set_bar(10); 

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

+0

@ AndyG Спасибо. Я их обновил. –

+0

ok если мой экземпляр for_cont называется f1, я мог бы сделать f1 [i] .set_bar (10)? Нужно ли мне дважды переопределять оператор []? В чем цель этого? – PtK

+0

@PtK Второй оператор необходим, если используется постоянный объект или постоянная ссылка на объект. Например, если у вас есть общая функция f (const foo_cont &c);, когда внутри этой функции вы можете использовать только вторую перегрузку оператора, предназначенного для постоянных объектов. –

0

Как изменить элементы foo_vec с помощью set_bar()?

Внутри класса foo_cont

Если вы хотите вызвать set_bar() на первый элемент вектора в foo_cont, вы используете:

foo_vec[0].set_bar(10); 

Если вы хотите вызвать set_bar() на n -й (по индексу) элемент вектора в foo_cont, вы используете:

foo_vec[n].set_bar(10); 

пользователей класса

Вы можете предоставить доступ к n -му элемент foo_vec через функцию оператора или путем предоставления функции доступа к самому вектору.

bar& operator[](size_t i) 
{ 
    return foo_vec[i]; 
} 
bar const& operator[](size_t i) const 
{ 
    return foo_vec[i]; 
} 

и использовать его как:

foo_cont f1; 
f1.add_element(10); 
int a = f1[0].get_bar(); 

или

std::vector<foo>& get_foo_vector() 
{ 
    return foo_vec; 
} 

std::vector<foo> const& get_foo_vector() const 
{ 
    return foo_vec; 
} 

и использовать его как:

foo_cont f1; 
f1.add_element(10); 
int a = f1.get_foo_vector()[0].get_bar(); 
+0

Я верю, что OP задает вопрос о том, как это сделать через публичную публикацию 'foo_cont' API. Отвечайте Владу из Москвы. – AndyG

+0

В случае, если я не задал правильный вопрос, я хочу иметь экземпляр foo_cont в моем главном, как я могу получить доступ к foo_vec, даже если он является частным членом экземпляра foo_cont ? – PtK

+0

@PtK, я понимаю. См. Обновленный ответ. –