2015-08-23 3 views
-2

Я создал метод, который должен изменить значения в моем объекте магазина. К сожалению, значения не изменяются.Значение объекта не будет изменено

редактировать: 18:13

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

Чтобы сделать мой вопрос более ясным: моя единственная проблема в том, что новые значения не сохраняются в объекте. Я выполнил отладку, и все значения были правильно рассчитаны и как ожидалось.

Проблема заключается в линиях:

shop.get_stock().push_back(inventory_bonbon); 

Эта линия должна толкать новый элемент инвентаря для вектора (содержащего элементы инвентаря), если этот пункт инвентаризации в настоящее время нет на складе.

Здесь я увеличиваю количество элемента инвентаризации, когда элемент находится в наличии:

i_inventory_shop.increase_amount(shop.get_stock()[i], amount); 

(У меня есть блок-протестировали метод INCREASE_AMOUNT() и она отлично работает.)

Две строки называются ожидаемыми (это означает, что я нахожу, когда товар находится в запасе или нет).


void IRooms::increase_inventory_shop(Shop & shop, Bonbon & bonbon, int amount) 
{ 
    OutputDebugString("I_Game Logic increase_inventory_shop called \n"); 

    IInventoryItemsBonbons i_inventory_shop; 
    bool bonbon_in_shop = false; 

    for (int i = 0; i < shop.get_stock().size(); i++) 
    { 
     OutputDebugString(("I_Game Logic shop vector size \n" + std::to_string(shop.get_stock().size()) + "\n").c_str()); 
     OutputDebugString(("I_Game Logic bonbon name \n" + bonbon.get_name() + "\n").c_str()); 
     OutputDebugString(("I_Game Logic bonbon amount \n" + std::to_string(amount) + "\n").c_str()); 

     if (bonbon.get_name() == shop.get_stock()[i].get_bonbon().get_name()) 
     { 
      bonbon_in_shop = true; 
      OutputDebugString("Bonbon found \n"); 
      i_inventory_shop.increase_amount(shop.get_stock()[i], amount); 
      break; 
     } 
    } 

    if (bonbon_in_shop == false) { 
     OutputDebugString("Bonbon not found \n"); 
     InventoryItemBonbons inventory_bonbon = i_inventory_shop.create(amount, bonbon); 
     shop.get_stock().push_back(inventory_bonbon); 
    } 
} 

Этот метод вызывает: (метод ниже, я тестировал)

void IInventoryItemsBonbons::increase_amount(InventoryItemBonbons & inventoryitem_shop, int amount) 
{ 
    int old_amount = inventoryitem_shop.get_amount(); 
    int new_amount = old_amount + amount; 
    inventoryitem_shop.set_amount(new_amount); 
} 

редактировать 17:51:

Shop.h

std::vector<InventoryItemBonbons> get_stock(); 

Shop.ccp

std::vector<InventoryItemBonbons> Shop::get_stock() 
{ 
    return stock_bonbons; 
} 

_____________________________________________________________________________edit: 19:54

Я теперь ввели локальные переменные и я возвращаю местный магазин.

Shop IRooms::increase_inventory_shop(Shop & shop, Bonbon & bonbon, int amount) 
{ 
    Shop shop_temp = shop; 
    std::vector<InventoryItemBonbons> inventory_items_temp = shop.get_stock(); 
    IInventoryItemsBonbons i_inventory_shop; 
    bool bonbon_in_shop = false; 

    for (int i = 0; i < shop_temp.get_stock().size(); i++) 
    { 
     if (bonbon.get_name() == shop_temp.get_stock()[i].get_bonbon().get_name()) 
     { 
      bonbon_in_shop = true; 
      i_inventory_shop.increase_amount(inventory_items_temp[i], amount); 
      break; 
     } 
    } 

    if (bonbon_in_shop == false) { 
     InventoryItemBonbons inventory_bonbon = i_inventory_shop.create(amount, bonbon); 
     inventory_items_temp.push_back(inventory_bonbon); 
    } 

    shop_temp.set_stock(inventory_items_temp); 

    //shop = shop_temp; 
    //return shop; 
    return shop_temp; 
} 

Единственное, что я хочу знать, почему стоимость магазина не изменится. Я попытался скопировать shop_temp в магазин, но даже это не работает.

+0

Вместо проверку только выхода, почему гайка на самом деле * запуск * в отладчике, и шаг за шагом через код построчно, чтобы увидеть, что же действительно происходит, а также * шаг в * функции, которые вы вызываете, ошибка может не отображаться в коде, который вы показываете. –

+1

Я бы предположил, что причина, по которой ваш объект магазина не изменен, заключается в том, что вы пишете локальную переменную 'IInventoryItemsBonbons i_inventory_shop;' вместо того, где вы думали, что пишете. – john

+0

Как выглядит 'Shop :: get_stock()'? –

ответ

1
std::vector<InventoryItemBonbons> get_stock(); 

С get_stock возвращается по значению, а не по ссылке, любые изменения значения, возвращаемого будут потеряны, как только что временная выходит из области видимости.

shop.get_stock().push_back(inventory_bonbon); 

Таким образом, это изменяет временный возвращаемый get_stock, который сразу же выходит из области видимости, разрушается, и модификация теряется.

Вы, наверное, хотел:

std::vector<InventoryItemBonbons>& get_stock(); 
... 
std::vector<InventoryItemBonbons>& Shop::get_stock() 
{ 
    return stock_bonbons; 
}