Указатель на вектор указателя в C ++ - PullRequest
0 голосов
/ 21 апреля 2019

Я изучаю C ++, и я столкнулся с похожей ситуацией в своем задании. Каждая из моих попыток решить это дело сопровождалась несколькими вопросами, поэтому я упростил это здесь.

Для этого сценария я буду использовать этот класс:

class Story {
    string _title;

    //a simple getter
    string getTitle(){ 
        return _title;
    }
};

Теперь в моей основной функции у меня есть stories, указатель на вектор с указателями на Story:

vector<Story *> * stories = function();

Моя цель - получить доступ к _title первого Story в моем векторе (мой размер вектора всегда будет больше 0).

Для этого я попробовал несколько методов, которые, как мне показалось, будут работать:

//Attempt 1 (doesn't work)
*(stories)[0]->title(); 
    //I thought `*(stories)[0]` returns the first `Story*`
    /** Error message:
     * error: ‘class std::vector<Story*>’ has no member named ‘title’
     */
//Attempt 1.5 (equivalent to Attempt 1)
*(stories).at(0)->title();

//Attempt 2 (works)
stories->at(0)->title(); 
    //Aren't `*(stories).at(0)` and `stories->at(0)` the same?
    //Since Attempt 1.5 failed, there as to be a difference..

//Attempt 3 (doesn't work)
stories->begin()->title(); 
    //I thought `stories->begin()` returns the first `Story*`
    /** Error message:
     * error: request for member ‘title’ in 
     * ‘* stories->std::vector<Story*>::begin().__gnu_cxx::__normal_iterator<Story**, std::vector<Story*> >::operator->()’, which is of pointer type ‘Story*’
     * (maybe you meant to use ‘->’ ?)
     */

Я понимаю, почему моя Попытка 2 работает, но я не понимаю, почему 1, 1.5 и 3 не работают.

На всякий случай, я компилирую, используя следующие параметры:

--std=c++11 -O0 -ggdb -Wall -Wextra

Ответы [ 2 ]

0 голосов
/ 21 апреля 2019

begin возвращает итератор (указывающий на начало вектора), и итератор должен быть разыменован, чтобы получить элемент, на который он указывает.

С begin()-> (или (*stories->begin())) вы разыменовываете этот итератор и получаете Story *, но Story * не имеет члена title.Таким образом, оно должно быть (*stories->begin())->title()

Или использовать front , поскольку оно возвращает ссылку на первый элемент.

0 голосов
/ 21 апреля 2019

В случае вашей попытки 3,

stories->begin() вернет итератор, чтобы напечатать значение, сохраненное в позиции, указанной итератором, попробуйте что-то вроде этого

*(stories->begin())
...