Изменения, внесенные в член объекта, внутри объекта, внутри вектора, не сохраняются в конце метода. C ++ - PullRequest
0 голосов
/ 30 мая 2020

Извините за название. Я не могу сделать что-то более описательное или ясное, чем это ..

Я пытаюсь сделать что-то, что очень похоже на c аукцион.

Чтобы упростить ситуацию, я собираюсь поместите сюда самое необходимое для каждого класса. Еще я перевел все с испанского sh на английский sh, так что если есть опечатка, то только здесь. Фактический код компилируется нормально.

Здесь задействовано четыре класса:

class Person
{
private:
    std::string name;
}

class Offer
{
private:
    int amount;
    Person *bidder;
}

class Item
{
private:
    int itemNumber;
    std::string itemName;
    Offer *biggestBidder;

public:
    Item(int, std::string)
    void setbiggestBidder(Offer* const &); // I did this '* const &' thing while trying solutions
    Oferta *getBiggestBidder();
}

class Auction
{
private:
    std::vector<Item> itemCollection;
    int amountOfItems; // in above's collection 
}

Я не помещал сюда геттеры, сеттеры и конструкторы / деструкторы, так что это не слишком долго. Внутри предмета. cpp У меня есть:

Item::Item(int number, std::string name)
:itemNumber(number), 
itemName(name), 
biggestBidder(NULL)
{
    // this->itemNumber= number;
    // this->itemName= name;
    // this->biggestBidder= NULL;
}

void Item::setbiggestBidder(Offer* const &offer)
{
    if (biggestBidder== NULL || biggestBidder->getAmount() < offer->getAmount())
    {
        std::cout << "Address of offer in setbiggestBidder: " << offer << std::endl;
        std::cout << "Address of biggestBidder in setbiggestBidder: " << (biggestBidder) << std::endl;
        biggestBidder = offer;
        std::cout << "Address of biggestBidder in setbiggestBidder: " << (biggestBidder) << std::endl;
    }
    else
    {
    }
}

Oferta *Lote::getBiggestBidder()
{

    std::cout << "Address of biggestBidder in getBiggestBidder(): " << this->biggestBidder << std::endl;
    if (this->biggestBidder == nullptr)
    {
        std::cout << "biggestBidder IS NULL" << std::endl;
    }
    else
    {
        std::cout << "biggestBidder is NOT NULL" << std::endl;
    }

    return biggestBidder;
}

Теперь главное и проблема:

Item l1(111, "BANANA");
Item l2(222, "MESA"); // this number 222 is just an ID for the item. It does nothing
Person p1("TheDude");
Offer of1(100, &p1);

// now put the item inside a vector and create an auction instance
std::vector<Item> item1;
collect.push_back(banana);
Auction coleccion1(collect, collect.size());


/*
Now we are ready. If I do this..
*/

std::cout << "Test with item outside vector" << std::endl;

std::cout << "Bidding $" << of1.getAmount() << " for item number " 
            << l2.getNumber() << ", " << l2.getItemName() << std::endl;

l2.setBiggestBidder(&of1); // amount 100
/*
If here I do 

l2.setBiggestBidder(&of2); // amount 200
l2.setBiggestBidder(&of1); // amount 100

At the bottom of the output, we get 200. It's all good.
*/
std::cout << l2.getBiggestBidder()->getAmount() << std::endl;

/* 
We get this output:
Test with item outside vector
Bidding $100 for item number 222, MESA
Address of offer in setbiggestBidder: 0x66fb20
Address of biggestBidder in setbiggestBidder: 0
Address of biggestBidder in setbiggestBidder: 0x66fb20
Address of biggestBidder in getBiggestBidder(): 0x66fb20
biggestBidder is NOT NULL
200 <-- l2.getBiggestBidder()->getAmount()
*/

// But if we try with the item inside the vector:

std::cout << "Bidding $" << of1.getAmount() << " for item number " 
                << coleccion1.getItemCollection().at(0).getNumber() << ", " 
                    << coleccion1.getItemCollection().at(0).getItemName() << std::endl;

/*
We get:
Test with item in vector
Bidding $100 for item number 111, BANANA
Address of offer in setbiggestBidder: 0x66fb10
Address of biggestBidder in setbiggestBidder: 0
Address of biggestBidder in setbiggestBidder: 0x66fb10
Address of biggestBidder in getBiggestBidder(): 0
biggestBidder IS NULL
0

and here is the issue.
*/

Мне действительно не нравится, когда нужно делать такой большой пост для проблемы я уверен, что это что-то очень базовое c, но я искал везде и не могу найти никакого решения этой проблемы. Прошло несколько недель с тех пор, как я наткнулся на это.

Почему все работает нормально, если я помещаю элемент в метод setBiggestBidder, но изменение не сохраняется в конце метода, когда я помещаю элемент, который является внутри вектора? И как исправить?

1 Ответ

0 голосов
/ 30 мая 2020

collect.push_back(l2); создает копию. l2 и coleccion1.getItemCollection().at(0) - два разных объекта. При изменении l2 coleccion1.getItemCollection().at(0) не изменится. Вы можете сохранить указатель в векторе. Вы должны помнить, что объект уничтожается в конце функции, а вектор содержит висящий указатель.

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