4

次の行をコンパイルしようとしていますが、ポインターの混乱に悩まされています。

int test = _s->GetFruitManager()->GetFruits()[2].GetColour();
std::cout << test << std::endl;

ここで、_sはSへのポインターであり、GetFruitManager()はFruitManagerオブジェクトへのポインターを返し、GetFruits()はaを返します。std::vector<Fruit>*次に、演算子[]を使用して特定のFruitオブジェクトにアクセスし、FruitのGetColour( ) 方法。

ある時点で、GetFruits()によって返されるvector *を逆参照する必要があると思いますが、その方法がわかりません。

これがやや複雑な場合はお詫びします!私はまだこの言語に慣れていませんが、これを解決するために助けていただければ幸いです。私はそれをより消化しやすいステップに分解しようとしましたが、どちらの方法でもコンパイルすることができませんでした。

とにかくこのコードスニペットを使用しないことにしたのですが、好奇心の問題になっているので、とにかく質問を送信します:)

4

6 に答える 6

5

これを行う必要があります:

(*(_s->GetFruitManager()->GetFruits()))[2].GetColour();
于 2012-04-17T14:55:04.617 に答える
4

構文を使用する代わりに[]、次を呼び出すことができます.at()

int test = _s->GetFruitManager()->GetFruits()->at(2).GetColour();
于 2012-04-17T14:57:37.837 に答える
3

醜い版:

int test = _s->GetFruitManager()->GetFruits()->operator[](2).GetColour();
于 2012-04-17T14:59:01.083 に答える
2

GetFruits()はい、 :によって返されるポインタを逆参照する必要があります。

int test = (*_s->GetFruitManager()->GetFruits())[2].GetColour();
于 2012-04-17T14:55:01.493 に答える
2
FruitManager*        temp_ptr  = _s->GetFruitManager();
std::vector<Fruit>*  ptr_vec   = temp_ptr->GetFruits();
Fruit*               f_obj_ptr = (*ptr_vec)[2];

int test = f_obj_ptr->GetColour();

正解は掲載されていますが、読みやすいバージョンの方がいいと思います。そして、2日後に戻ってきたときに、バグを見つけたり、修正をはるかに簡単/迅速に行うことができます。

于 2012-04-17T15:08:21.783 に答える
0

誰もそれについて言及していないので、この代替手段もあります(私は個人的にgdbでのみ使用するのが好きです):

int test = _s-> GetFruitManager()-> GetFruits()[0] [2] .GetColour();

于 2012-04-17T15:18:57.897 に答える