Почему NetBeans показал неправильное автозаполнение? - PullRequest
1 голос
/ 14 июля 2010

Вчера у меня был экзамен по программированию в конце первого семестра.Это было довольно просто, за исключением того, что я сделал очень, очень непонятную ошибку, о которой я хотел спросить здесь более опытных людей:

У меня был класс Library, содержащий вектор, содержащий элементы Loan *, который содержиткласс Customer и Book.Примерно так:

class Library
{
    vector<Loan*> loans_;
};

class Loan
{
    Customer *customer_;
    Book *book_;
};

У меня была функция, которая требовала пройти через все инициализированные объекты книги и увидеть, какие из них кому принадлежат, например:

Customer *getBorrower(Book *book)
{
    vector<Loan*>::iterator iter;

    for( iter = loans_.begin(); iter != loans_.end(); ++iter )
    {
        if( (*iter).getBook() == book )
            return (*iter).getCustomer();
        else
            continue;
    }
    return 0;
}

Это поставило меня в тупикпотому что в Netbeans 6.9 IDE (* iter).показал мне список всех методов объекта Loan.

Я как раз собирался бросить экзамен, когда загрузил VC ++ 08, и он спросил меня, не хочу ли я вместо этого использовать ->.

(*iter)->getBook(); работал для моего огорчения.

Итак, мой вопрос: почему IDE позволил мне использовать . и даже выдавать список методов, а также для ->?Насколько мне известно, это не делает такого рода безумие в любое время.Что именно здесь произошло?Я не понимаю, что я пытался заставить метод сделать, который дал мне странную ошибку NetBeans "Не типа Loan *"

Второй вопрос: Это вопрос стиля.Я прокомментировал это профессору, но он не казался слишком приятным.В соответствии с рекомендациями экзамена мы также создали общедоступные

vector<Book*> и vector<Customer*>.

. Затем мы получили доступ к ним из основной функции для запуска наших модульных тестов.Я обнаружил, что это крайне плохая практика, поскольку простая функция получения могла бы дать нам то, что нам нужно, без публикации нашей информации.Правильно ли я назвал это плохим дизайнерским выбором?

Ошибка:

Library.cpp: 14: ошибка: запрос для члена getCustomer' in (& iter) -> __ gnu_cxx :: __ normal_iterator <_Iterator, _Container> ::оператор * с _Iterator = Loan **, _Container = std :: vector> ', который имеет неклассовый тип `Loan *'

Ответы [ 3 ]

2 голосов
/ 14 июля 2010

Ну, кажется, что Intellisense просто лучше, чем NetBeans. ;)

(*iter)->getBook() - верный способ добраться до метода в этом случае. Обратите внимание, что итератор является своего рода указателем с перегруженными операторами * и ->, которые ведут себя как обычный указатель.

В вашем случае, *iter - это разыменование элемента в векторе, который является указателем. Итак, если вы хотите получить доступ к методу, вы должны использовать оператор ->, поэтому конструкция (*iter)->getBook() действительна. А также более запутанный метод: (*(*iter)).getBook().

2 голосов
/ 14 июля 2010

Выражение (*iter)->getBook() должно работать. Тип vector<T>::iterator является чем-то, что «указывает» на экземпляр T, и обычно является простым старым T*. В вашем случае T - это Loan*, поэтому T* - это Loan**. Таким образом, iter - это Loan**, поэтому (*iter) - это Loan*, к которому вы обращаетесь с помощью оператора ->.

Вполне возможно, что NetBeans запутался так же, как и вы, хотя у него меньше оправданий. : -)

1 голос
/ 14 июля 2010

В C (*foo).bar будет следовать за указателем foo на структуру foo и найдет член bar.Поскольку ввод текста очень утомителен, введено foo->bar, чтобы следовать за указателем foo на структуру foo и найти элемент bar.

Таким образом, вы должны выбрать использование .vs -> в зависимости от того, работаете ли вы с указателем на структуру или работаете со структурой.

Обратите внимание, что я не знаю, как C ++ расширил использование -> и .с классами, но поскольку первые реализации C ++ были основаны на C со структурами, я предполагаю , что -> и . работают с классами так же: объекты типа class разыменовываются с . и объекты типа pointer to class разыменовываются с ->.Но это предположение с моей стороны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...