Увеличить FOR_EACH по сравнению с Ptr_Vector? - PullRequest
1 голос
/ 23 сентября 2010

В настоящее время я получаю удовольствие, пытаясь выучить некоторые из библиотеки Boost.В настоящее время я делаю то, что, я думаю, будет будущим домашним заданием (семестр еще не начался).Однако этот вопрос не о задаче домашнего задания, а о Boost.

Code:

/* AuctionApplication.h */
class AuctionApplication : boost::noncopyable
{
private:
    boost::ptr_vector<Auction> auctions_;
    boost::ptr_vector<Bidder>  bidders_;
    boost::ptr_vector<Bid>     bids_;


/* AuctionApplication.cpp */
Bid *AuctionApplication::GetLatestBid(const Auction *auction)
{
    Bid *highestBid = 0;

    BOOST_FOREACH(Bid *bid, bids_) // Error here!
        if (bid->GetAuction()->GetName() == auction->GetName())
            highestBid = bid;

BOOST_FOREACH используется для работы с нормальными векторами с точно таким же кодом, как указано выше.С тех пор как я начал использовать ptr_vectors, я получаю сообщение об ошибке:

error C2440: '=' : cannot convert from 'Bid' to 'Bid *'

. Это наводит меня на мысль, что ptr_vector каким-то образом скрывает указатель от метода foreach.

Если я вместо этого напишу

BOOST_FOREACH(Bid *bid, bids_)

, я получу четыре ошибки типа

error C2819: type 'Bid' does not have an overloaded member 'operator ->'

, которые отстой, потому что я знаю, что ставка являетсяуказатель.

Как я могу сделать BOOST_FOREACH итерацию правильно по ptr_vectors?

1 Ответ

8 голосов
/ 23 сентября 2010

ptr_vector становится владельцем объектов, выделенных в куче, и представляет каждый объект как ссылку, так что вам не нужно разыменовывать и вы используете.вместо -> для доступа к переменным / функциям-членам.например,

Bid highestBid = 0;
BOOST_FOREACH (Bid& bid, bids_)
    if (bid.GetAuction()->GetName() == auction->GetName())
        highestBid = &bid;
...