1

所以我想做一个使用类项目向量的库存程序。到目前为止,我的代码看起来像这样:

#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() 函数中存储了数据,我如何通过取消引用在其他函数中使用该数据向量数据?

4

2 回答 2

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。我们真正需要做的只是有时只调用 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

于 2012-11-02T05:13:55.283 回答
1

您需要修复 OOP 的基础知识。您没有在 Item 类的 main 中创建对象。没有它,您将无法调用公共成员函数。

只能调用静态成员函数而不创建类对象。

其次,在成员函数中创建类本身的向量是疯狂的。如果必须,请在课外进行。

类定义了一个实例的属性和行为。如果您希望创建实例数组/向量,则必须在类外部完成,然后每个实例调用一些成员函数。

你应该创建你的类来处理一个没有向量的项目。getdata 函数还应该接受一项的输入。您在主目录中创建一个向量。然后在这个向量上运行一个循环,并为这些项目中的每一个调用 get_item 或任何其他 api。详细地说,在循环中从控制台获取输入并将其传递给 vector[index].setitem()

于 2012-11-02T04:23:22.660 回答