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() 返回的向量*,但我不知道如何。

抱歉,如果这有点令人费解!我对这门语言还是很陌生,但希望能得到一些帮助来解决这个问题。我确实尝试将其分解为更易于理解的步骤,但无论哪种方式都无法使其编译。

实际上我只是决定不使用这个代码片段,但这已经成为一个好奇的问题,所以我仍然会提交这个问题:)

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
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 回答
2

是的,您需要取消引用返回的指针GetFruits()

int test = (*_s->GetFruitManager()->GetFruits())[2].GetColour();
于 2012-04-17T14:55:01.493 回答
0

由于没有人提到它,还有这个替代方案(我个人喜欢只在 gdb 中使用):

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

于 2012-04-17T15:18:57.897 回答