This program keeps track of a hardware store inventory. It's very barebones, all it needs to do is put the information into a vector of pointers to a struct, allow the user to sell items, and print the report. I have printing down no problem, but selling is where I run into problems. I just can't think of a good way to do it. This is what I have right now.

#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
#include <conio.h>
#include <vector>
#include <algorithm>

using namespace std;




struct SInventory
{
	string ItemID;
	string itemName;
	int pOrdered, pInStore, pSold;
	double mPrice, sellPrice;
	static int count;
	static double totalPrice;
};

struct FindByName 
{
    string ID;
    FindByName(const string& ID) : ID(ID) {}
    bool operator()(SInventory* s) { return s->ItemID == ID; }
};

int SInventory::count;
double SInventory::totalPrice;

class print
{
public:
	void operator ()(SInventory* ptr)
	{
		ptr->pInStore = ptr->pOrdered - ptr->pSold;
		cout << left << setw(8) << ptr->ItemID << setw(20) << ptr->itemName << setw(8) << ptr->pOrdered << setw(8) << ptr->pInStore << setw(8) << ptr->pSold << setw(10) << setprecision(2) << fixed << ptr->mPrice << setw(10) << ptr->sellPrice << endl;
		ptr->count += ptr->pInStore;
		ptr->totalPrice += ptr->pInStore * ptr->sellPrice;
	}
};

char menuChoice();
void addItems(vector<SInventory*>& vec);
void sellItem(vector<SInventory*>& vec);

int main()
{
	vector<SInventory*> vec;
	char menu = ' ';
	addItems(vec);
	while (menu != 'c')
	{
		menu = menuChoice();
		switch(menu)
		{
		case 'a':
			sellItem(vec);
			break;
		case 'b':
			cout << endl << left << setw(8) << "Item ID" << setw(20) << "Item Name" << setw(8) << "Order" << setw(8) << "Store" << setw(8) << "Sold" << setw(10) << "M. Price" << setw(10) << "S. Price" << endl << endl;
			for_each(vec.begin(), vec.end(), print());
			cout << endl << "Total Inventory: " << SInventory::totalPrice << endl << "Total number of items in store: " << SInventory::count << endl << endl;
			break;
		case 'c':
			break;
		default:
			cout << "Invalid choice";
			break;
		}
	}
			_getch();
	return 0;
}

char menuChoice()
{
	char menu;
	cout << "a. Sell Item" << endl << "b. Print Report" << endl << "c. Exit" << endl;
	cout << "\nEnter a choice ";
	cin >> menu;
	return menu;
}

void addItems(vector<SInventory*>& vec)
{
	char str[99];
	SInventory temp;
   ifstream i;

   i.open("items.txt");
	while(!i.eof())
	{
		i.getline(str, 99);
		temp.ItemID = str;
		i.getline(str, 99);
		temp.itemName = str;
		i >> temp.pOrdered;
		i >> temp.mPrice;
		i >> temp.sellPrice;
		temp.pSold = 0;
		temp.pInStore = 0;
		vec.push_back(new SInventory (temp));
		i.getline(str, 99);
	}
}

void sellItem(vector<SInventory*>& vec)
{
	string no;
	int sell;
	cout << "Enter the item number of the item you want to sell";
	cin >> no;
	vector<SInventory*>::iterator it = find_if(vec.begin(), vec.end(), FindByName(no));
	cout << "You are selling: " << endl << *it;
	cout << endl << "How many do you want to sell? ";
	cin >> sell;
}

I tried getting the information out of the iterator, but for some reason, when I print it as a pointer, all I get is it's address, and if I take the * out, I get this error:

Error	1	error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'std::_Vector_iterator<_Ty,_Alloc>' (or there is no acceptable conversion)	c:\users\andrew\documents\visual studio 2008\projects\project 5\project 5\project 5.cpp	118

Same goes for what I try after sell. I tried using it->ItemID, *it->ItemID, dot notation, and it all gives me 2 errors:

Error	1	error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'std::_Vector_iterator<_Ty,_Alloc>' (or there is no acceptable conversion)	c:\users\andrew\documents\visual studio 2008\projects\project 5\project 5\project 5.cpp	118
Error	3	error C2039: 'ItemID' : is not a member of 'std::_Vector_iterator<_Ty,_Alloc>'	c:\users\andrew\documents\visual studio 2008\projects\project 5\project 5\project 5.cpp	121

So right now I'm at a loss of what to do. If anyone can point me in the right direction, I'd be very grateful.

Recommended Answers

All 2 Replies

When you output a pointer, you will certainly get its address. That's what a pointer is, just an address.

When you dereference the pointer and print that, you'd have to have the << operator defined.

friend std::ostream& operator<<(std::ostream& output,  const Point &P);

Here is a full example:
http://programmingexamples.net/index.php?title=CPP/OverloadOperator

Shouldn't it be:

(*it)->ItemID
Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.