2012-02-18 7 views
1

これは私が長さについて申し訳ありません、まで私の問題を仕事ができる最も簡単です:クラスの参照を介してアクセスし、変更ベクトル

#include <vector> 
#include <iostream> 

class Bar 
{ 
private: 
    std::vector<int> intVector_; 
public: 
    Bar() {}; 
    void addInt(int newInt) 
    { 
     intVector_.push_back(newInt); 
     std::cout << intVector_.size() << " "; 
    }; 
    int getIntVectorSize() { return intVector_.size(); }; 
}; 

class Foo 
{ 
private: 
    Bar bar_; 
public: 
    Foo() { bar_ = Bar(); }; 
    Bar getBar() { return bar_; }; 
}; 

int main(char argc, char* argv[]) 
{ 
    Foo foo = Foo(); 
    foo.getBar().addInt(1); 
    std::cout << foo.getBar().getIntVectorSize() << " "; 
    foo.getBar().addInt(2); 
    std::cout << foo.getBar().getIntVectorSize() << " "; 
    foo.getBar().addInt(3); 
    std::cout << foo.getBar().getIntVectorSize() << " "; 
} 

私の問題は、ベクターにint型を追加するだけのために続くように思われることです期間はaddInt()です。ベクトルの大きさのための私の出力は次のようになります。

1 0 1 0 1 0 

私はC++と、このすべての参照/ポインタ事業にかなり新しいので、私は、私はこの問題を解決することができます方法についての困惑、またはこれがあればしていますさらに可能です。助けてくれてありがとう!

答えて

0

getBar()は、関数のすべての呼び出しのためにbar_のコピーを作成しますBarによって値を返し、あなたが一時的なのベクトルを変更しているからです。

class Foo 
{ 
private: 
    Bar bar_; 
public: 
    Foo() { bar_ = Bar(); }; // you prob. want to use an initialiser list btw. 
    Bar& getBar() { return bar_; }; 
// ^notice the ampersand 
}; 

この方法では、getBarの戻り値に行われた変更は、文の終わりに破壊される一時的なコピーをbar_に行われていません。

あなたは、参照を返すことによって、これを回避することができます。

+0

私はおそらく私が何かばかげたことをしていることを知っていました。 :(迅速な答えをありがとう。 – KyleMayes

関連する問題