std::vector型のiteratorを使いそのクラスのメンバ関数を使う方法が知りたい。

投稿者: user42117

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

#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("v3nn");

    for (std::vector<test>::iterator itr = v3->begin(); itr != v3->end(); itr++)
    {
        //itr->mPlay();     
    }

    printf("nn v2nn");

    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;
}

解決

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

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

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

  for (test& t : *v3)
    t.mPlay();
  for (test* t : v2)
    t->mPlay();

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

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *