2016-10-31 11 views
0

多形になっています。私は機能を呼び出すときにベクトルに問題があります。これは私のコードです:2クラス継承のベクトルで呼び出し関数

Class Customer: 


#pragma once 
#include<iostream> 
#include<string> 
#include<vector> 
using namespace std; 
class Customer 
{ 
protected: 
    string id; 
    float money; 
public: 
    Customer(); 
    ~Customer(); 
    virtual void Input(); 
    virtual void Output(); 
    string GetId() 
    { 
     return id; 
    } 
    void SetId(string ID) 
    { 
     id = ID; 
    } 
}; 

クラスLoyalCustomer:

#pragma once 
#include"Customer.h" 
class LoyalCustomer:public Customer 
{ 
    int level; //level of relationship 
public: 
    LoyalCustomer(); 
    ~LoyalCustomer(); 
    void Input(); 
    void Output(); 
}; 

RegularCustomer:

#pragma once 
class RegularCustomer:public Customer 
{ 
public: 
    RegularCustomer(); 
    ~RegularCustomer(); 
    void Input(); 
    void Output(); 
}; 

クラススーパーマーケット:

#pragma once 
#include"LoyalCustomer.h" 
#include"RegularCustomer.h" 
class SuperMarket 
{ 
    vector<Customer*> list; 
public: 
    SuperMarket(); 
    ~SuperMarket(); 
    void FindCustomer() 
    { 
     string ID; 
     cout << "Input id of customer: "; 
     cin >> ID; 
     for (int i = 0; i<list.size(); i++) 
      if (ID == list[i]->GetId()) 
      { 
       //do something 
      } 
    } 
    void Input() 
    { 
     string ID; 
     cout << "Input id of customer: "; 
     cin >> ID; 
     Customer *p = NULL; 
     if (ID[0] == 'L') 
     { 
      p = new LoyalCustomer; 
      p->Input(); 
      p->SetId(ID); 
      list.push_back(p); 
     } 
     if (ID[0] == 'R') 
     { 
      p = new RegularCustomer; 
      p->Input(); 
      p->SetId(ID); 
      list.push_back(p); 
     } 
    } 
    void Output() 
    { 
     //printf customer 
    } 
}; 

私はFindCustomerでのgetId()関数を呼び出します()関数は、if(ID = = list [i] - > GetId())を実行してコードを実行すると、プログラムはエラーを通知しませんが、 "ID"を入力すると見つかりません。私はそれを修正する方法を知らない。私を助けてください。ありがとう!

+0

プログラムのような文字列を比較してみ右実行していますか?リストが空でないことを確認しましたか? – Sean83

+0

IDの設定者ではなく、IDをコンストラクタのパラメータとして使用することを検討してください。 – user4581301

+0

問題をより明確に記述してください。それはうまくいかない、どう?何も返されないか、比較に問題がありますか?デストラクタも仮想でなければなりません。 LoyalCustomer/RegularCustomerの入力/出力機能は、カスタマの入力/出力機能を浅くすることによって継承のルールを破ります。それは仮想キーワードによって基本クラスの仮想を上書きする必要があります。また、私は顧客の中でこれらの機能の本体が見えなかったのですが、なぜそれらを純粋な仮想に設定しないのですか? –

答えて

-1

ID.compare(list[i]->GetId()) == 0

+1

OPには比較権があります。 – user4581301

+0

'=='演算子は 'std :: string'で多重定義されています – George

関連する問題