объекты не сохраняются и печатаются из вектора? - PullRequest
0 голосов
/ 10 февраля 2020

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

#include <vector>
#include <iostream>
#include <string>

int main() {
  std::vector<GroceryItem*> item;
  GroceryItem* grocery = new GroceryItem;
  std::string option = " ";
  while((option != "x") && (option != "X")){
    std::cout << "Welcome to Kroger\n";
    std::cout << "A- add item\n";
    std::cout << "X - Exit\n";
    std::cout << "type option:";
    std::cin >> option;
    std::cin.ignore();
        if(option == "A" || option == "a") {
          std::cout << "Enter UPC, Product Brand, Product Name, and Price\n";
          std::string item_;
          double price_ = 0.0;
          std::getline(std::cin, item_);
          grocery->upcCode(item_);
          std::getline(std::cin, item_);
          grocery->brandName(item_);
          std::cin.ignore();
          std::getline(std::cin, item_);
          grocery->productName(item_);
          std::cin >> price_;
          grocery->price(price_);
          item.push_back(grocery);

        } else if(option == "x" || option == "X") {
          std::cout << "Here is an itemized list of the items in your shopping basket:\n";
          for (GroceryItem* gcry  : item) {
            std::cout << *gcry;
          }
         }
        }
      }

это объявленный перегруженный оператор извлечения. cpp

std::ostream& operator<<( std::ostream& stream, const GroceryItem& groceryItem ) {
  stream << "\"" << groceryItem.upcCode() << "\", " << "\"" << groceryItem.brandName() << ", "
   << groceryItem.productName() << ", " << groceryItem.price() << "\n";
   return stream;

это пример вывода:

Welcome to Kroger
A- add item
X - Exit
type option:a
Enter UPC, Product Brand, Product Name, and Price
2134567890
heinz
ketchup
222
Welcome to Kroger
A- add item
X - Exit
type option:a
Enter UPC, Product Brand, Product Name, and Price
2345678
coca cola
coke
3.33
Welcome to Kroger
A- add item
X - Exit
type option:x
Here is an itemized list of the items in your shopping basket:
"2345678", "coca cola, oke, 3.33
"2345678", "coca cola, oke, 3.33


Ответы [ 2 ]

1 голос
/ 10 февраля 2020

ваша grocery переменная является указателем, что означает, что она указывает на объект; при изменении переменной указателя изменяются и указатель, и объект в векторе.

Как предложил Влад, попробуйте переместить его в l oop, не забудьте использовать delete, если вы используете new

1 голос
/ 10 февраля 2020

Переместите это утверждение

GroceryItem* grocery = new GroceryItem;

в l oop.

Например,

  std::string option = " ";
  while((option != "x") && (option != "X")){
    std::cout << "Welcome to Kroger\n";
    std::cout << "A- add item\n";
    std::cout << "X - Exit\n";
    std::cout << "type option:";
    std::cin >> option;
    std::cin.ignore();
        if(option == "A" || option == "a") {
              GroceryItem* grocery = new GroceryItem;
              //...

И, похоже, вызов игнорирования в этом фрагменте кода

      std::getline(std::cin, item_);
      grocery->brandName(item_);
      std::cin.ignore();             //  <===
      std::getline(std::cin, item_);

следует удалить.

...