71339


for文２つですがどうやって`itr->mPlay();`などといった形で`class
test`のメンバ関数`mPlay()`を参照出来るのか知りたいです。

[code]

    #include <iostream>
    #include <array>
    #include "glm/ext.hpp"
    #include <vector>
    
    class test
    {
        public:
            test(bool f) {
                frag = f;
            }
    
            bool mPlay()
            {
                printf("ああ\n");
                return frag;
            }
    
        private:
            bool frag;
    };
    
    std::vector<test*> v2;
    std::vector<test>* v3 = new std::vector<test>;
    
    int main()
    {
    
        v3->push_back(test(false));
        v3->push_back(test(true));
        v3->push_back(test(false));
    
        printf("v3\n\n");
    
        for (std::vector<test>::iterator itr = v3->begin(); itr != v3->end(); itr++)
        {
            //itr->mPlay();     
        }
    
        printf("\n\n v2\n\n");
    
        v2.push_back(new test(false));
        v2.push_back(new test(true));
        v2.push_back(new test(false));
    
        for (std::vector<test*>::iterator itr = v2.begin(); itr != v2.end(); itr++)
        {
            //itr->mPlay();     
        }
    
        return 0;
    }
    
[/code]


CC BY-SA 4.0
2020-10-20T03:41:47.900
71337
2020-10-20T04:42:49.180
2020-10-20T04:37:27.467
3060
question
c++
std::vector<>型のiteratorを使いそのクラスのメンバ関数を使う方法が知りたい。


太古の [c++98](/questions/tagged/c%2b%2b98 "'c++98' のタグが付いた質問を表示")
に縛られずにもっと新しい文法を使えば単純明快

[code]

    for (auto& a : v2) {
        a->mPlay();
    }
    
[/code]

iterator はポインタを更に抽象化したものなのでうんぬんの話は例えば  
[イテレータとポインタの違い](https://ja.stackoverflow.com/questions/6882/)  
[意味の分からないコード２つの意味が知りたい。](https://ja.stackoverflow.com/questions/49569/)

[c++98](/questions/tagged/c%2b%2b98 "'c++98' のタグが付いた質問を表示") 縛りがあるなら

`*itr` と書いたら `vector<test*>` の要素が得られる、すなわち `*itr` の型は `test*`  
ポインタ経由でメンバ関数を呼ぶなら `->` が必要  
演算子の結合順から `*itr->mPlay()` ではダメで `(*itr)->mPlay()` とする

ってだけのことです。


CC BY-SA 4.0
2020-10-20T04:34:40.477
71338
2020-10-20T04:34:40.477
8589
71337
answer


`v3` は `itr` が「`test` を指すポインタのようなもの」なので、`itr->mPlay()` でコンパイルできるはずです。

`v2` は `itr` が「`test*` を指すポインタのようなもの」なので、デリファレンスして `(*itr)->mPlay()` または
`(**itr).mPlay()`となります。

現在の C++ ではこういった単純ループにイテレータを使うコードは書きません。

[code]

      for (test& t : *v3)
        t.mPlay();
    
[/code]

[code]

      for (test* t : v2)
        t->mPlay();
    
[/code]

で済みます。環境によってはC++-11を有効化する必要があるかも知れません。


CC BY-SA 4.0
2020-10-20T04:42:49.180
71339
2020-10-20T04:42:49.180
3475
71337
answer