Вчера у меня был экзамен по программированию в конце первого семестра.Это было довольно просто, за исключением того, что я сделал очень, очень непонятную ошибку, о которой я хотел спросить здесь более опытных людей:
У меня был класс 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 *'