2017-01-27 16 views
-2

私は以下のコードを持っています。なぜなら、for-eachステートメントがdoubler()で呼び出されたときに、Aオブジェクトのベクトルが変更されていない理由がわかりません。構造体。このコードは以下のとおりです。もし誰かがこのような場合に大きな理由があるとすれば、私はそれが私が見落としている何か小説だと確信しています。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、

Iそれぞれの値が2倍になることを期待していましたが、何らかの理由でdoubler()のfor-eachステートメントが何もしませんでした。

+0

参照渡しではなく値渡し... – Jarod42

+1

'operator()'を見てください。 'a'はどうやって渡されましたか? – NathanOliver

+0

また、 'std :: set'の要素を直接変更することはできません。 – NathanOliver

答えて

0

オペレータはaを値渡ししてコピーを作成します。代わりに参照を取る。

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

編集:それはあなたがstd::setであなたの操作を適用しているコメントで指摘されています。セットの要素は変更できません。セット内の要素を変更できない理由の詳細は、See this answerを参照してください。

0

doubler::operator()の実装では、Aオブジェクトを値で渡しています。 Aオブジェクト自体ではなく、Aオブジェクトのコピーを倍増しています。

struct doubler 
{ 
    void operator() (A& a) { a.setA(a.getA() * 2); } 
}; 
関連する問題