所以我想做一个使用类项目向量的库存程序。到目前为止,我的代码看起来像这样:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Item{
private:
string month;
string name;
float volume;
float sales;
public:
void print();
void print2();
void sale();
void report();
void getdata();
void setname (string itemname){name=itemname;}
void setID(int setID){ID=setID;}
};
void Item::print(){
cout<<"Name : "<<name<<endl;
cout<<"ID : "<<ID<<endl;
}
void Item::print2(){
vector<Item>*::iterator i;
for (i=list.begin(); i !=list.end(); ++i){
i->print();
}
/*void Item::sale(){
vector<Item> }
void Item::report(){
}*/
void Item::getdata(){
vector<Item> items;
string name;
int ID;
Item *a;
for (int n=0; n<2; n++){
cout<<"Enter name:"<<endl;
getline(cin, name);
cout<<"Enter ID: "<<endl;
cin>>ID;
a = new Item;
a->setname(name);
a->setID(ID);
items.push_back(*a);
cin.get();
}
}
int main(){
cout<<"0. Exit \n1. Item Sale \n2. Daily Report \n3. Weekly Check \n4. Monthly Update \n5. Load Inventory File \n6. S\
ort file by Key \n7. Save inventory to a file \n8. Add a New Item \n9. Edit an Item \n10. Delete an item\n";
int x;
cin>>x;
switch(x){
case 0:
exit(0);
break;
case 1:
sale();
break;
case 2:
break;
case 8:
getdata();
break;
default:
cout<<"Wrong choice!\n";
break;
}
程序无法编译,因为getdata()
在案例8中没有调用函数,为什么会这样?另一个问题是,如果我在getdata()函数中存储数据,我如何通过解除引用在其他函数中使用该数据向量数据?
答案 0 :(得分:2)
我建议将对象设计分为两部分:一部分代表一个项目,另一部分代表库存。
档案:
class Item
{
public:
void print() const;
void sale();
void report();
void setname (string itemname){name=itemname;}
void setID(int setID){ID=setID;}
private:
string month;
string name;
int ID;
float volume;
float sales;
};
void Item::print() const
{
cout<<"Name : "<<name<<endl;
cout<<"ID : "<<ID<<endl;
}
清单:
class Inventory
{
public:
void print() const;
void report();
void getdata();
private:
std::vector<Item> items;
};
void Inventory::print() const
{
for (
vector<Item>::const_iterator iter = list.begin();
iter != items.end();
++iter)
{
iter->print();
}
}
void Inventory::getdata()
{
string name;
int ID;
for (int n=0; n<2; n++)
{
cout<<"Enter name:"<<endl;
getline(cin, name);
cout<<"Enter ID: "<<endl;
cin>>ID;
Item item;
item.setname(name);
item.setID(id);
items.push_back(item);
cin.get();
}
}
以下是您的主要内容:
int main()
{
Inventory inventory;
cout
<< "0. Exit \n"
<< "1. Item Sale \n"
<< "2. Daily Report \n"
<< "3. Weekly Check \n"
<< "4. Monthly Update \n"
<< "5. Load Inventory File \n"
<< "6. Sort file by Key \n"
<< "7. Save inventory to a file \n"
<< "8. Add a New Item \n"
<< "9. Edit an Item \n"
<< "10. Delete an item\n";
int x;
cin>>x;
switch(x)
{
case 0:
exit(0);
break;
case 1:
sale();
break;
case 2:
inventory.report();
break;
case 8:
inventory.getdata();
break;
default:
cout<<"Wrong choice!\n";
break;
}
}
请注意,您需要该类的对象才能调用成员函数。 getdata()
如果没有它所扮演的对象,就没有任何意义。
编辑:你问过“你如何通过向量迭代来查找特定的ID?”
我们已经看到如何遍历以在每个成员上调用print。我们真正需要做的只是打电话打印。
首先,您需要一种方法来告诉项目的ID。在Item:
中的setID(...)之后添加int getID() const {return ID;}
现在你可以在迭代时检查这个值:
void Inventory::find
(
const int ID_
) const
{
bool found = false;
for (
vector<Item>::const_iterator iter = items.begin();
iter != items.end();
++iter)
{
if (iter->getID() == ID_)
{
cout << "Found item " << ID_ << ": \n";
iter->print();
found = true;
}
}
if (!found)
{
cout << "No items matching " << ID_ << " found." << endl;
}
}
您可以在此处查看一个有效的示例:http://codepad.org/w1MwGCYo
答案 1 :(得分:1)
您需要修复OOP的基础知识。您没有在类Item的主要内容中创建对象。如果没有这个,你就无法调用公共成员函数。
只能在不创建类对象的情况下调用静态成员函数。
其次,在成员函数中创建类本身的向量是疯狂的。如果必须,请在课外进行。
类定义一个实例的属性和行为。如果你想创建一个实例的数组/向量,它必须在类之外完成,然后每个实例调用一些成员函数。
你应该创建你的类来处理一个没有向量的项目。 getdata函数还应该为一个项目输入。你在main中创建了一个向量。然后在这个向量上运行一个循环,并为每个项目调用get_item或任何其他api。详细说明,在循环中从控制台获取输入并将其传递给vector [index] .setitem()