2017-01-27 2 views
-2

У меня есть следующий код в одной из моих проблем для программы сертификации, в которой я участвую, и не могу понять, почему вектор объектов A не изменяется при вызове for-each с удвоителем() структура. Код ниже, если кто-то может пролить свет на то, почему это так, что было бы здорово; Я уверен, что это что-то незначительное, что я пропускаю.Функциональная структура оператора C++ ничего не делает?

class A { 
    int a; 
public: 
    A(int a) :a(a) {} 
    int getA() const { return a; } void setA(int a) { this->a = a; } 
    bool operator < (const A & b) const { return a<b.a; } 
}; 
struct myprinter { void operator() (const A & a) { cout << a.getA() << ", "; } }; 
struct doubler 
{ 
    void operator() (A a) { a.setA(a.getA() * 2); } 
}; 

int main() { 
    int mynumbers[] = { 3, 9, 0, 2, 1, 4, 5 }; 
    vector<A> v1(mynumbers, mynumbers + 7); 
    set<A> s1(mynumbers, mynumbers + 7); 
    for_each(v1.begin(), v1.end(), doubler()); for_each(v1.begin(), v1.end(), myprinter()) 
    for_each(s1.begin(), s1.end(), doubler()); for_each(s1.begin(), s1.end(), myprinter()); 
    return 0; 
} 

Мой выходе из программы выглядит следующим образом: 3, 9, 0, 2, 1, 4, 5, 0, 1, 2, 3, 4, 5, 9,

Я ожидал, что каждое из значений будет удвоено, но по какой-то причине утверждение for с каждым удвоением() ничего не делало.

+0

Передача по значению вместо передачи по ссылке ... – Jarod42

+1

Посмотрите на свой 'operator()'. Как проходит «а»? – NathanOliver

+0

Также обратите внимание, что вы не можете напрямую изменить элемент 'std :: set'. – NathanOliver

ответ

0

Ваш оператор принимает a по стоимости, делая его копию. Вместо этого возьмите ссылку.

void operator() (A & a) { a.setA(a.getA() * 2); } 
//  Add this^

Edit: Это было указано в комментариях, что вы претендуете вашу операцию на std::set. Элементы набора не могут быть изменены. See this answer для получения дополнительной информации о том, почему вы не можете изменять элементы в наборе.

0

В вашей реализации doubler::operator() вы передаете объект Aпо значению. Он дублирует копию объекта A, а не самого объекта A. Вы, вероятно, захотите:

struct doubler 
{ 
    void operator() (A& a) { a.setA(a.getA() * 2); } 
}; 
Смежные вопросы