2015-10-29 118 views
0

我試圖設置運算符,將兩個數組放在一起,但取出數組中的dublicates。 我的想法是將第一個數組複製到新數組中,然後將不在第一個數組中的「產品」複製到新數組中。 我試圖調用一個函數,檢查「產品」是否在第一個數組中,但我不斷收到錯誤: 錯誤:成員函數'er_varan_eins'不可行:'this'參數的類型'const Inventory',但功能沒有被標記const的似乎無法調用我的功能

這裏是我的代碼:

#include <iostream> 

using namespace std; 


struct Varan{ 
    string vara; 
    int fjoldi; 
    double verd; 
}; 

class Inventory { 
public: 
    Inventory(); 
    void stafrofsrod(); 
    void verdmaetisrod(); 
    void setsortorder(string rodun); 
    void setsorting(); 
    bool er_varan_eins(const Varan vara1); 

    ~Inventory(); 

    friend istream& operator >> (istream& ins, Inventory &inv); 
    friend ostream& operator << (ostream& outs, const Inventory &inv); 
    friend Inventory operator + (const Inventory &inv1, const Inventory &inv2); 

private: 
    Varan *vorulisti; 
    int n; 
    string order; 

}; 

Inventory::Inventory() { 
    n = 0; 
    vorulisti = new Varan[n]; 
} 

void Inventory::stafrofsrod() { 
    Varan tmp; 
    int i, j; 

    for (i = 1; i < n; i++) { 
     tmp.vara = vorulisti[i].vara; 
     tmp.fjoldi = vorulisti[i].fjoldi; 
     tmp.verd = vorulisti[i].verd; 
     j = i; 
     while (j > 0 && vorulisti[j - 1].vara > tmp.vara) { 
      vorulisti[j].vara = vorulisti[j - 1].vara; 
      vorulisti[j].fjoldi = vorulisti[j - 1].fjoldi; 
      vorulisti[j].verd = vorulisti[j - 1].verd; 
      j--; 
     } 
     vorulisti[j].vara = tmp.vara; 
     vorulisti[j].fjoldi = tmp.fjoldi; 
     vorulisti[j].verd = tmp.verd; 
    } 
} 

void Inventory::verdmaetisrod() { 
    Varan tmp; 
    int i, j; 

    for (i = 1; i < n; i++) { 
     tmp.vara = vorulisti[i].vara; 
     tmp.fjoldi = vorulisti[i].fjoldi; 
     tmp.verd = vorulisti[i].verd; 
     j = i; 
     while (j > 0 && (vorulisti[j - 1].fjoldi * vorulisti[j - 1].verd) < (tmp.fjoldi * tmp.verd)) { 
      vorulisti[j].vara = vorulisti[j - 1].vara; 
      vorulisti[j].fjoldi = vorulisti[j - 1].fjoldi; 
      vorulisti[j].verd = vorulisti[j - 1].verd; 
      j--; 
     } 
     vorulisti[j].vara = tmp.vara; 
     vorulisti[j].fjoldi = tmp.fjoldi; 
     vorulisti[j].verd = tmp.verd; 
    } 
} 

void Inventory::setsortorder(string rodun) { 
    order = rodun; 
    setsorting(); 
} 

void Inventory::setsorting() { 
    if (order == "Value") { 
     verdmaetisrod(); 
    } 
    else { 
     stafrofsrod(); 
    } 
} 

Inventory::~Inventory() { 
    delete [] vorulisti; 
} 

istream& operator >> (istream& ins, Inventory &inv) { 
    ins >> inv.n; 
    inv.vorulisti = new Varan[inv.n]; 
    for (int i = 0; i < inv.n; i++) { 
     ins >> inv.vorulisti[i].vara; 
     ins >> inv.vorulisti[i].fjoldi; 
     ins >> inv.vorulisti[i].verd; 
    } 
    inv.stafrofsrod(); 
    return ins; 
} 

ostream& operator << (ostream& outs, const Inventory &inv) { 
    for (int i = 0; i < inv.n; i++) { 
     outs << inv.vorulisti[i].vara << " " << inv.vorulisti[i].fjoldi << " " << inv.vorulisti[i].verd << endl; 
    } 
    return outs; 
} 

Inventory operator + (const Inventory &inv1, const Inventory &inv2) { 
    int counter = 0; 
    for (int i = 0; i < inv1.n; i++) { 
     for (int j = 0; j < inv2.n; j++) { 
      if (inv1.vorulisti[i].vara == inv2.vorulisti[i].vara) { 
       counter++; 
      } 
     } 
    } 

    int new_size = inv1.n + inv2.n - counter; 
    Inventory new_array; 
    new_array.n = new_size; 
    new_array.vorulisti = new Varan[new_size]; 

    for (int i = 0; i < inv1.n; i++) { 
     new_array.vorulisti[i].vara = inv1.vorulisti[i].vara; 
     new_array.vorulisti[i].fjoldi = inv1.vorulisti[i].fjoldi; 
     new_array.vorulisti[i].verd = inv1.vorulisti[i].verd; 
    } 
    int teljari = 0; 
    for (int j = 0; j < inv2.n; j++) { 
     if(inv1.er_varan_eins(inv2.vorulisti[j].vara)) { 
      teljari++; 
     } 
     else { 
      new_array.vorulisti[j + inv1.n - teljari].vara = inv2.vorulisti[j].vara; 
      new_array.vorulisti[j + inv1.n - teljari].fjoldi = inv2.vorulisti[j].fjoldi; 
      new_array.vorulisti[j + inv1.n - teljari].verd = inv2.vorulisti[j].verd; 
     } 
    } 
    new_array.stafrofsrod(); 
    return new_array; 
} 

bool Inventory::er_varan_eins(const Varan vara1) { 
    for (int i = 0; i < n; i++) { 
      if (vorulisti[i].vara == vara1.vara) { 
       return true; 
      } 
    } 
    return false; 
} 

int main() 
{ 
    Inventory inv1, inv2; 
    cin >> inv1 >> inv2; 
    cout << inv1 + inv2; 
    return 0; 
} 

回答

1

由於inv1const Inventory &,你只能調用它的const成員函數。您的er_varan_eins函數可以作爲const,因爲它不會修改任何庫存類的成員。