for eachで扱えるコレクションの実装

このQ&Aのポイント
  • CFooArrayというクラスを作成し、CFooDataクラスをdequeで持つように実装することでfor eachで扱えるコレクションを作ることができます。
  • dequeを外に出すことはできず、CFooArray内部にCFooDataクラスを持たせる必要があります。
  • 参考サイト: https://qiita.com/m195h/items/7b89425f72e5a2f2155a
回答を見る
  • ベストアンサー

for each で扱えるコレクションの実装

こんにちは。 プログラムの保守を請け負っているのですが、独自に実装されているリストクラスがありまして、 それをfor eachで操作できるようにとの指示がありました。 処理系はC++です。 CFooArrayというクラスだとしまして、内部にCFooDataというクラスをdequeで持っています。 要望としては CFooArray arrayFoo ; for each( CFooData fooData in arrayFoo ) { } とできるようにしてほしいとのことですが、そもそもfor eachで扱えるコレクションクラスを どう実装していいのかが分かりません。またdequeを外に出すのはナシと言われました。 どなたかご存じの方がいらっしゃいましたら教えていただけないでしょうか。 参考サイトでも紹介していただければ幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

なにがなんでも 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; } }

TeijigoTeatime
質問者

お礼

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

その他の回答 (3)

回答No.4

#3 補足 Visual C++ なら for ( CFooData item : array ) を for each ( CFooData item in array ) と書いてもいいみたい。 for each はあくまで Visual C++ の独自仕様だろうからオススメしません。

TeijigoTeatime
質問者

お礼

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

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

素の C++ (ISO/IEC 14882) にそんなものはないので C++/CLI (ECMA372) のことだと思っていい? もしそうなら, 「どうすればいいか」は EMCA372 の仕様に書いてあります.

TeijigoTeatime
質問者

お礼

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

  • chie65535
  • ベストアンサー率43% (8481/19299)
回答No.1

CFooArray arrayFoo ; とやった時に、arrayFooの実体が「配列」になっていれば for each( CFooData fooData in arrayFoo ) { } と書ける。 今はCFooArrayが「リスト構造を表せる、配列じゃないもの」だから、for eachが使えない。

TeijigoTeatime
質問者

お礼

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

関連するQ&A

  • コレクションクラスに対してFor Eachを使えるようにするには

    コレクションクラスの持つアイテムを For Each ・・・ Next でぶん回す方法を教えてください。 昔、本に載っていたのを見たのですが、 どーーーーーしても思い出せません! たしか、プロパティを1こ追加して、 object.[_Enum]のような行を追加していたような・・・ よろしくお願いします!

  • For Each ~ Next の動作

    コレクションの操作をするときなどに、 For tmp in testCol   List1.Add tmp Next ってな感じでFor Each文をつかいますよね。 あれって、 For i = 0 To testCol.Count   List1.Add testCol.Item(i) Next i と書くのに比べ、びっくりするほど処理が速いですよね。 いったい、どんな違いがあるのでしょうか。

  • For Each文内でのコレクションの変更について

    VB.Net/C# .NET Framework2.0で開発しております。 下記コード例のように、イテレータループ内(For Each文)でのコレクションの変更(要素の削除)ができないため、苦肉の策として下のように削除する予定のものを格納するバッファ(removeList)に一度登録し、その後もう一度ループをまわして実際に削除する、というコードを書いておりますが、分量も多くなり、一時変数なども出てくるため、あまりよいコードとは言えないと思います。 コレクションから特定の条件を満たした要素を削除するための、もうすこしスマートな書き方はないものでしょうか? 宜しくお願いいたします。 Dim removeList as new List(Of TestClass) For Each e as TestClass in targetList If e.IsDummy Then '直接targetList.Remove(o) とはできない removeList.Add(o) End If End For For Each e as TestClass in removeList targetList.Remove(e) End For

  • 【VBA】for each文でListbox値取得

    VBA7.1でfor each文を使い、Listbox(Lst1)の全ての値を 取得したいと思っています。 For Each 変数 In コレクションや配列 のコレクションや配列には何を指定したらよいでしょうか。 よろしくお願いいたします

  • ユーザーフォーム上でFor Each~Next?

    Excelユーザーフォームでマルチページを使用しているのですが テキストボックスに文字(パスワード的なもの)を入力したら マルチページ内の特定ページのコントロールをenabled=trueにしたいのです(通常はenebledがtrue・falseの混合ページです) 先日よりFor Each~Next構文を使い始めたのですが勉強不足『オブジェクト・コレクション』の概念がいまいち理解できません。よろしくお願いします。 ネット上で調べてコピペしたのですがこのままだと他のページ、ページ外のコントロールまで影響するので良い方法をアドバイスしていただけますか?やはりコントロール個別にコードを書くしかないのでしょうか? Private Sub TextPASS_Change() If TextPASS.Value = "aaaa" Then For Each Control In Controls 省略(enabled=true) Next Else For Each Control In Controls 省略(enabled=false) Next End If End Sub

  • VB.netでコレクションを変更させないようにするには

    C#、VB.net(.net framework 2.0)で開発しております。 FamilyクラスのListフィールド_peopleには外部からの変更操作(Add、Remove等)を許可したくないのですが、 以下のようにReadOnlyのプロパティを設けても、代入操作はできないもののコレクション自体への変更は可能となってしまいます。 ※family.People.Add(mem) 等 IListやICollectionインターフェースをImplementして独自のコレクションを作り、 AddやRemoveメソッド内で例外を投げたりすることも考えたのですが、 そもそもコンパイルを通したくありません。 こういった場合、どのように実装するのが定石でしょうか? 宜しくお願い致します。 以下コード例 Public Class Family Dim _people As List(Of Member) Public ReadOnly Property People() As Member Get Return _people End Get End Property End Class

  • コレクションの取り扱い

    宜しくお願いします。 下記のようなソースでクラスをコレクション化したのですが for each文で値が変わってくれません。(泣) 何か基本的な事だと思うのですが、お知恵を頂ければ幸いです。m(__)m 'emp Collection Public Class clsEmp Inherits System.Collections.ArrayList '色々とメソッドを追加予定・・・ End Class 'empの構造体 Public Structure emp Public ID As Integer Public name As String Public score As Integer Public Sub New(ByVal ID_ As Integer, ByVal name_ As String) Me.ID = ID_ Me.name = name_ Me.score = -1 End Sub End Structure 'モジュール 'empのCollectionを宣言 Private emps As New clsEmp Private Sub Form_Load(・・・) Dim i% 'とりあえず、インスタンスを作る For i = 0 To 10 emps.Add(New emp(i, "test" & i)) Next End Sub Private Sub Button3_Click(・・・) Dim emp_ As emp '初期化してみる For Each emp_ In emps Debug.WriteLine(emp_.name) emp_.score = 0 Next '確認用 For Each emp_ In emps Debug.WriteLine(emp_.score) Next End Sub

  • コレクションクラスの使い分け方

    プログラミング初心者です。 コレクションクラスについて勉強中ですが、 1:ArrayListクラス(Listインターフェース) 2:HashSetクラス(Setインターフェース) 3:HashMapクラス(Mapインターフェース) 4:Vectorクラス 5:Iteratorインターフェース これらの違いがよく分かりません。 <質問1> 1と2の違いは、 1:順序付けて、重複オブジェクトを保持する 2:順不同で一意のオブジェクトを保持する というところまでは分かりました。 これらと3・4の違いって何でしょうか? <質問2> 5:ポインタを前後に動かすような感じで、保持したコレクションの中身を操作できる、 ということだと思いました。 1~4まででも、要素(インデックス)を指定しれやれば、中身を操作することはできると思うのですが、これを使ったほうがどのように便利なのでしょうか? 初歩的な質問で申し訳ありませんが、具体例などを示して教えていただければ助かります。 よろしくお願いします。

    • ベストアンサー
    • Java
  • VB6のコレクション

    Dim FileSys As Object Dim Prox As Object Dim fj As Object Set FileSys = CreateObject("Scripting.FileSystemObject") Set Prox = ColFileSys.Files For Each fj In Prox ~ 質問を簡単にするために端折ってあります。 上記のコードで動いているプログラムがあるのですが filesはfileコレクションを返すとあり、上記のコードの宣言を Dim Prox As Collection と変更しました。 これで理論的にはうまく動くかと思ったのですが 「型が一致しません」のエラーになりました。 Collectionの運用法に関しては間違っていないと思いますが 何が原因でエラーなのかさっぱり分かりません。 なお、Collectionに関しては次のサイトを参考にしました。 そこをスクロールしていって上から4つ目のキーというところに用法があります。 http://homepage1.nifty.com/rucio/main/shokyu/jugyou23.htm

  • CollectionとArrayの呼び出し順

    こんばんは。 いつも勉強させてもらっています。 ご教授ください。 セル範囲A1:B3に適当な値を入れ 下記のコードを実行してみました。 ----------------------------------------------- Sub Test()   Dim Rng As Range   Dim myRange As Range   Set myRange = Range("A1").CurrentRegion     For Each Rng In myRange       Debug.Print "Collection: " & Rng.Value     Next Rng   Dim Ary   Dim myArray      myArray = Range("A1").CurrentRegion.Value     For Each Ary In myArray       Debug.Print "Array: " & Ary     Next Ary End Sub ----------------------------------------------- その結果、 Collectionの場合は、 A1>B1 >A2>B2 >A3>B3 Arrayの場合は、   A1>A2>A3 >B1>B2>B3 の順で呼び出されました。 なぜこのような違いがでるのか分かりません。 教えてください。 宜しくお願いします。