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;
  }

ケース8が関数を呼び出さないため、プログラムはコンパイルgetdata()されません。それはなぜですか。もう1つの質問は、getdata()関数にデータを格納している場合、逆参照によってそのデータベクトルデータを他の関数でどのように使用できるかということです。

4

2 に答える 2

2

オブジェクトデザインを2つの部分に分割することをお勧めします。1つはアイテムを表し、もう1つはインベントリを表します。

アイテム:

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を伝える方法が必要です。アイテムの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のメインでオブジェクトを作成していません。これがないと、パブリックメンバー関数を呼び出すことができません。

クラスのオブジェクトを作成せずに静的メンバー関数を呼び出すことしかできません。

第二に、メンバー関数内にクラス自体のベクトルを作成することは非常識です。必要に応じて、クラスの外でそれを行います。

クラスは、1つのインスタンスのプロパティと動作を定義します。インスタンスの配列/ベクトルを作成する場合は、クラスの外部で作成する必要があります。その後、インスタンスごとにいくつかのメンバー関数を呼び出します。

ベクトルなしで1つのアイテムを処理するクラスを作成する必要があります。getdata関数は、1つの項目の入力も受け取る必要があります。メインにベクトルを作成します。次に、このベクターでループを実行し、これらのアイテムごとにget_itemまたはその他のAPIを呼び出します。詳細を説明すると、ループ内でコンソールから入力を取得し、それをvector [index] .setitem()に渡します。

于 2012-11-02T04:23:22.660 に答える