C ++ Доступ к члену класса из указателя вектора класса - PullRequest
1 голос
/ 03 сентября 2010

Извините, но это действительно сбивает меня с толку, и я знаю, что ответ смотрит мне в лицо, и я не могу понять это. Может ли кто-нибудь взглянуть? Это для школьного проекта системы бронирования авиабилетов.

Эта функция принимает номер рейса, вместимость, количество полеты, и вектор, содержащий все полеты в качестве аргументов. Он проверит, чтобы убедиться, что рейс не существует, если есть ошибка сообщение будет отображаться, если не будет создан полет. Количество для количество рейсов также будет увеличено.

void newFlight( string f, string s, int* n, vector<Flight> *v)
{

    Flight temp;

    //Check to see if flight number exists
    bool alreadyExist = false;
    for (int i=0; i < v->size(); i++)
    {
        if (f.compare((v[i].getNumber()) == 0))
        alreadyExist = true;
    }

    //If it doesn't exist, create it
    if (!alreadyExist)
    {       
        v->push_back (temp);    //Add the new Flight object to the 
                                            //vector of flights
        *n++;           //Increase count
    }

    else
    {
        cout << "A flight numbered " << f << " already exists"; 
        cout << ". Flight not created.\n";
    }   

};

Моя проблема в том, что, когда я пытаюсь сравнить номер рейса, рейсы уже в векторе с тем, который я пытаюсь добавить. В строке 7 я продолжаю получать это сообщение:

ошибка: ‘class std::vector<Flight, std::allocator<Flight> >’ не имеет члена с именем 'getNumber' '

Вектор, о котором идет речь, является вектором с классом Flight, в котором есть член с именем getNumber (). Я передаю вектор в функцию по ссылке. Так что v это указатель, но я думал, что [] позаботится об этом. Я также пытался использовать оператор -> вместо оператора точки, но это не помогает. Я в растерянности, любая помощь будет оценена. Я относительно ржавый, лето только что закончилось: D Также я надеюсь, что это отформатировано правильно.

Ответы [ 5 ]

5 голосов
/ 03 сентября 2010

Аргумент v передается вашей функции как указатель на вектор.Если вы затем используете оператор [], он думает, как и в C, что v является указателем на массив векторов, поэтому v [i] на самом деле все еще является вектором.

Что вы должны сделать, этоэто:

(*v)[i].getNumber();
3 голосов
/ 03 сентября 2010

Если v - указатель на вектор, то выражение v[n] означает n-й вектор в массиве векторов v. Вам нужно (*v)[n].

2 голосов
/ 03 сентября 2010

Моя проблема в том, что когда я пытаюсь сравнить номер рейса, рейсы уже в векторе с тем, который я пытаюсь добавить. В строке 7 я продолжаю получать это сообщение:

Возможно, вам следует переключиться на отсортированный контейнер, например set или map. Тогда об этом позаботятся автоматически.

0 голосов
/ 03 сентября 2010

Несколько других ответов уже устранили проблему: v - указатель, поэтому вы должны использовать немного другой синтаксис, чтобы получить то, что вы хотите.

Я бы предположил, что если такой вектор долженвсегда передаваться этой функции (в другом мире вы никогда не передадите NULL), тогда вы должны передавать по ссылке, а не по указателю.В этом случае ваша функция будет принимать vector<Flight> &v, что позволит вам работать с вектором без лишних хлопот с синтаксисом указателя.v[i].getNumber() на самом деле будет работать.

0 голосов
/ 03 сентября 2010

Выглядит как небольшая проблема с скобками.

Попробуйте изменить это:

 if (f.compare((v[i].getNumber()) == 0))

на

 if (f.compare((v[i].getNumber())) == 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...