4

vector の要素への参照を返すことについて、非常に基本的な質問があります。

vecclass のインスタンスを格納する vector がありますFoo。この vector から要素にアクセスしたい。(ベクトル インデックスを使用したくない) . ここでメソッドをどのようにコーディングすればよいgetFooですか?

#include<vector>
#include<stdio.h>
#include<iostream>
#include<math.h>

using namespace std;
class Foo {      
      public:
             Foo(){};
             ~Foo(){};
};


class B {
      public:
             vector<Foo> vec;
             Foo* getFoo();
             B(){};
             ~B(){};
};


Foo* B::getFoo(){
int i;
vec.push_back(Foo());
i = vec.size() - 1;

// how to return a pointer to vec[i] ??

return vec.at(i);

};

int main(){
    B b;
    b = B();
    int i  = 0;
    for (i = 0; i < 5; i ++){
        b.getFoo();   
        }

    return 0;
}
4

4 に答える 4

2

getFoo() メソッドに新しい Foo オブジェクトを追加するのはなぜですか? i番目のものを取得するだけではいけませんか?

もしそうなら、あなたは次のようなものを使うことができます

Foo *getFoo(int i) {
  return &vec[i];  // or .at(i)
}

ベクトルの最後の要素が必要な場合は、back()メソッドを使用します。

于 2010-04-26T04:35:42.390 に答える
2

参照を返すことができるのに、なぜポインターを使用するのでしょうか?

Foo& B::getFoo() {
    vec.push_back(Foo());
    return vec.back();
}

再割り当てが発生すると、コンテンツへの参照、ポインター、およびイテレーターvectorが無効になることに注意してください。

また、(ここのように) メンバー データを公開するvecことはお勧めできません。必要に応じて、クラスにアクセス メソッドを提供することをお勧めします。

于 2010-04-26T04:45:04.060 に答える
1

戻る方法を使用します。あなたは返すことができます&vec.back();

于 2010-04-26T04:36:53.980 に答える
1

ポインターの代わりに参照を使用することをお勧めします。このような

Foo& B::getFoo(){
  vec.push_back(Foo());
  return vec.back();
};

もちろん、クラス B の getFoo() の宣言も変更する必要があります。

class B {
      public:
             vector<Foo> vec;
             Foo& getFoo();
};
于 2010-04-26T04:49:33.477 に答える