コンポジションパターンのようなものを使用して、任意の数のサブプログレスバーを持つことができるプログレスバークラスを構築しようとしています。
私がこのクラスを持っているとしましょうpbar
:
class pbar
{
public:
pbar(const int w) { width = w; } // already sets the
~pbar() {}
void setwidth(const int w) { width = w; } // set the width to w
void show() const;
void sync();
void add(const pbar bar)
{
// add's a subbar
subbars.pushback(bar);
}
private:
std::vector<pbar> subbars; // the sub-process progressbars
int width; // onscreen width of the pbar
};
ご覧のpbar
とおり、には幅とサブプログレスバー(それ自体)の2つのメンバーがありますpbars
。私は、 inのすべての幅を、それが呼び出されたときの幅と一致するようにsync
変更する関数を実装しようとしてきました。pbars
subbars
pbar
void pbar::sync()
{
for ( pbar bar : subbars )
{
bar.setwidth(width); // first set the width of the subbar
bar.sync(); // secondly make it sync up it's subbars
}
}
しかし、これはうまくいかないようです。私はこのテストプログラムを使ってみました:
int main()
{
pbar a(1);
pbar b(2);
pbar c(3);
pbar d(4);
c.add(d);
b.add(c);
a.add(b);
a.show();
std::cout << "syncing" << std::endl;
a.sync();
a.show();
}
次のように定義されたshow
関数を使用します。
void pbar::show() const
{
std::cout << w << std::endl;
for ( pbar bar : subbars )
{
bar.show();
}
}
期待される出力は次のようになります。
1
1
1
1
それでもそれは:
1
2
3
4
奇妙なことに、このshow()
関数はすべてのサブバーまで適切に反復されますが、そうでsync()
はないように見えます(実際、実際に反復することcout
を確認しましたが、効果がないようです)。
私のコードの何が問題になっていますか?c++0x
古いイテレータループを使用してみたので、typeforループの使用ではありません。私が犯した間違いを見つけることができません。pbar
で使用setwidth
するときに間違ったを変更しているという事実と関係があると思いますsync
。
免責事項:これは実際にはより大きなプロジェクトの一部であり、クラスはここに示されているよりもはるかに複雑ですが、上記のコードを使用して不要な動作を再現することができました(ちなみに、これはコピーペーストされておらず、含まれている可能性がありますタイプミス)