2017-10-13 74 views
0

全部錯誤:ERROR c2678:二進制「==」

錯誤2錯誤C2678:二進制「==」:沒有操作員發現它採用類型「項」的左邊的操作數(或沒有可接受轉換)C:\程序文件(86)\微軟的Visual Studio 12.0 \ VC \包括\算法1734 1 GameStore


清單類(CPP文件)

#include <iostream> 
#include <string> 
#include <vector> 
#include <algorithm> 
#include <Windows.h> 
#include "item.h" 

class Inventory 
{ 


public: 

void Inventory::viewInventory() 
{ 
    for (int i = 0; i < inventory.size(); i++) 
    { 
     Inventory::inventory[i].getItemName(); 
    } 
} 

void Inventory::addItem(Item& item) 
{ 
    inventory.push_back(item); 
} 


void Inventory::removeItem(Item& item) 
{ 
    if (std::find(inventory.begin(), inventory.end(), item) != inventory.end()) 
    { 
     inventory.erase(std::remove(inventory.begin(), inventory.end(), item), inventory.end()); 
    } 

    else 
    { 
     std::cout << "Item does not exist" << std::endl; 
    } 
} 

//Player Gold methods 
int Inventory::getGold() 
{ 
    return playerGold; 
} 

void Inventory::setGold(int newGold) 
{ 
    playerGold = newGold; 
} 


int Inventory::addGold(int newGold) 
{ 
    playerGold += newGold; 
    return playerGold; 
} 

int Inventory::removeGold(int newGold) 
{ 
    playerGold -= newGold; 
    return playerGold; 
} 
//Player Gold methods 




private: 
std::vector<Item> inventory = {}; 
int playerGold; 

}; 

基本上我試圖做的是製作一個庫存系統,它保存類「Item」中的對象。我花了很長時間讓我的循環和我的所有方法工作,然後因爲天空從來沒有更清晰,我得到了一個錯誤,從我的聯盟出來。


項類(CPP)

#include "item.h" 
#include <iostream> 
#include <string> 


Item::Item(int id, std::string name, std::string description, std::string examime) 
{ 
    itemName = name; 
    itemID = id; 
    itemDescription = description; 
    itemExamine = examime; 

} 

void Item::setItemName(std::string newName) 
{ 
    itemName = newName; 
} 

void Item::setItemDescription(std::string newDescription) 
{ 
    itemDescription = newDescription; 

} 

void Item::setItemExamine(std::string newExamine) 
{ 
    itemExamine = newExamine; 
} 

void Item::setItemID(int newID) 
{ 
    itemID = newID; 
} 

std::string Item::getItemName() 
{ 
    return itemName; 
} 

std::string Item::getItemDescription() 
{ 
    return itemDescription; 
} 

std::string Item::getItemExamine() 
{ 
    return itemExamine; 
} 

int Item::getItemID() 
{ 
    return itemID; 
} 

項類(頭)

#include <iostream> 
#include <string> 

class Item 
{ 
public: 
    //constructor 
    Item::Item(int id, std::string name, std::string description, std::string examime); 

    //setters 
    void setItemName(std::string newName); 
    void Item::setItemDescription(std::string newDescription); 
    void Item::setItemExamine(std::string newExamine); 
    void Item::setItemID(int newID); 

    //getters 
    std::string Item::getItemName(); 
    std::string Item::getItemDescription(); 
    std::string Item::getItemExamine(); 
    int Item::getItemID(); 

private: 
    std::string itemName; 
    int itemID; 
    std::string itemDescription; 
    std::string itemExamine; 

}; 

如果你有哪怕是重做我的整個的去系統中的任何意見關於這將是偉大的。這些課程顯然非常裸露,我將增加更多。意思我不是在尋找像「你甚至不需要物品類」的答案

感謝您的幫助!

+1

該錯誤消息似乎非常清楚。你沒有'=='運算符,它帶有一個'Item'類型的左邊參數。如果你想比較自定義類型(比如你的類'Item'),那麼你需要自己重載*合適的比較運算符。 –

+1

如果你不明白爲什麼編譯器會抱怨'=='運算符,因爲你並沒有直接在任何地方直接使用它,所以想想['std :: find'](http://en.cppreference .com/w/cpp/algorithm/find)函數確實如何工作... –

+0

這可能很有用:https://stackoverflow.com/q/4421706/1025391 – moooeeeep

回答

2

您的代碼的「核心」問題似乎是Item類缺少operator==實現,因爲編譯器錯誤告訴您。

爲C++初學者(無後顧之憂:我們每個人是一個初學者),你很可能會問,爲什麼op==必需的,只要你不把它明確在你的代碼。那麼,確實沒有明確地稱呼它,但是標準庫實現中的代碼是這樣做的。特別是,你調用std::find(在<algorithm>頭實現的,也就是在錯誤消息中引用):

void Inventory::removeItem(...) 
{ 
    if (std::find(inventory.begin(), inventory.end(), item) != inventory.end()) 
    { 
     ... 

std::find需要Item實例與op==比較。 所以,要儘量解決您的代碼,請比較Item S,這樣的定義operator==

// In the Item class header: 

class Item 
{ 
    ... 
}; 

inline bool operator==(const Item& a, const Item& b) 
{ 
    // Implement your comparison logic for Items a and b. 
    // ... 
    // Return true if "a == b". 
} 

隨着更多的旁註,當你聲明你的類中的成員函數,你不需要的成員函數之前使用Item::前綴:

class Item 
{ 
public: 
    //constructor 
    Item::Item(int id, std::string name, std::string description, std::string examime); 

    //setters 
    void setItemName(std::string newName); 
    void Item::setItemDescription(std::string newDescription); 
    void Item::setItemExamine(std::string newExamine); 
    void Item::setItemID(int newID); 
    ... 

只要做到:

class Item 
{ 
public: 
    //constructor 
    Item(int id, std::string name, std::string description, std::string examime); 

    //setters 
    void setItemName(std::string newName); 
    void setItemDescription(std::string newDescription); 
    void setItemExamine(std::string newExamine); 
    void setItemID(int newID); 

    ... 

而且,考慮讓你的干將const,使類常量,正確的,例如:

class Item 
    { 
    public: 
     ... 
     std::string getItemName() const; 
     std::string getItemDescription() const; 
     std::string getItemExamine() const; 
     int getItemID() const; 

     ... 
    }; 
+1

感謝您的提示!我感謝您花時間幫助! –

+0

@JacobOConnor不客氣。我很高興我有一些幫助。 –