プロが教えるわが家の防犯対策術!

こんにちは。
プログラムの保守を請け負っているのですが、独自に実装されているリストクラスがありまして、
それをfor eachで操作できるようにとの指示がありました。
処理系はC++です。

CFooArrayというクラスだとしまして、内部にCFooDataというクラスをdequeで持っています。
要望としては

CFooArray arrayFoo ;

for each( CFooData fooData in arrayFoo )
{
}

とできるようにしてほしいとのことですが、そもそもfor eachで扱えるコレクションクラスを
どう実装していいのかが分かりません。またdequeを外に出すのはナシと言われました。

どなたかご存じの方がいらっしゃいましたら教えていただけないでしょうか。
参考サイトでも紹介していただければ幸いです。

A 回答 (4件)

なにがなんでも for each じゃなきゃダメですか?


range-based for なら簡単に実装できますが。

#include <iostream>
#include <deque>

using namespace std;

typedef int CFooData;

class CFooArray {
typedef std::deque<CFooData> container_type;
public:
typedef container_type::iterator iterator;
void add(const CFooData& data) { data_.push_back(data); }
// begin()とend()を定義すればrange-based for が使える。
iterator begin() { return data_.begin(); }
iterator end() { return data_.end(); }
private:
container_type data_;
};

int main() {
CFooArray array;
array.add(1);
array.add(2);
array.add(3);

for ( CFooData item : array ) {
cout << item << endl;
}
}
    • good
    • 0
この回答へのお礼

詳細な返答ありがとうございます。
なぜfor eachではなければならないかを確認したところC#でと構文が同じだからだそうです。
リストを拝見しました。
こういう実装の仕方があるのかと目から鱗です。
とても参考になります。
for ( CFooData item : array )でよいか確認してみます。

お礼日時:2014/06/23 12:03

#3 補足



Visual C++ なら

for ( CFooData item : array ) を
for each ( CFooData item in array ) と書いてもいいみたい。

for each はあくまで Visual C++ の独自仕様だろうからオススメしません。
    • good
    • 0
この回答へのお礼

そうなのですか。
for ( CFooData item : array )
でダメなのか提案してみます。

お礼日時:2014/06/23 12:01

素の C++ (ISO/IEC 14882) にそんなものはないので C++/CLI (ECMA372) のことだと思っていい?



もしそうなら, 「どうすればいいか」は EMCA372 の仕様に書いてあります.
    • good
    • 0
この回答へのお礼

早々のご返答ありがとうございます。
上記のepistemeさんより指摘されていますが、VisualC++の仕様のようです。
言語実装については全く知らないので機会があれば勉強してみたいと思います。

お礼日時:2014/06/23 12:00

CFooArray arrayFoo ;



とやった時に、arrayFooの実体が「配列」になっていれば

for each( CFooData fooData in arrayFoo )
{
}

と書ける。

今はCFooArrayが「リスト構造を表せる、配列じゃないもの」だから、for eachが使えない。
    • good
    • 0
この回答へのお礼

早々のご返答ありがとうございます。
説明が不十分だったと思います。
私も理解できていないまま質問してしまいました。

お礼日時:2014/06/23 11:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!