在Inventory.h中添加vector的方法出错

时间:2012-11-22 02:25:53

标签: c++ vector compiler-errors

嘿,我为我的库存设置了一个标题和一个.cpp文件。我正在使用矢量。我无法使用矢量库中的任何push /或pop方法。我想在主要使用它们。另外我和我做的添加方法有3个错误,所以我可以添加到主要的矢量。

任何人都可以帮助我理解为什么我不能使用向量函数以及为什么我会收到这些错误。

这是我的代码: 的 Inventory.h

 #ifndef INVENTORY_H
    #define INVENTORY_H
    #include <string>


class Inventory
{
public:
    //Constructor
    Inventory();

    //Methods.
    std:: string add(string item);
    void displayInventory();
    void showInventory();
private:
    //Data members
    };


#endif //INVENTORY_H

Inventory.cpp

 #include "Inventory.h"
    #include <iostream>
    #include <vector>   //  To enable the use of the vector class.
    #include <string>


using namespace std;
vector<string> inventory;
vector<string>::iterator myIterator;
vector<string>::const_iterator iter;


Inventory::Inventory()
{

}

string Inventory :: add(string item)
{
inventory.push_back(item);
return item;
}

void Inventory:: showInventory()
{
char input[80];
    cin >> input;
    char inventoryRequest[] = "i";
    int invent = strcmp (input,inventoryRequest);
    //compare the player input to inventoryRequest (i) to see if they want to look at inventory.
    if(invent == 0)
    {
        displayInventory();
    }


}
void Inventory:: displayInventory()
{
//vector<string> inventory;
    cout<< "You have " << inventory.size() << " items.\n";
    cout << "\n******Inventory******";
    cout<< "\nYour items:\n";
    for (int i= 0; i< inventory.size(); ++i)
        cout<< inventory[i] << endl;
}

错误

Error   1   error C2061: syntax error : identifier 'string' c:\users\conor\documents\college\dkit - year 2 - repeat\dkit - year 2 - semester 1 - repeat\games programming\maroonedca2\maroonedca2\inventory.h   17  1   MaroonedCA2
Error   2   error C2061: syntax error : identifier 'string' c:\users\conor\documents\college\dkit - year 2 - repeat\dkit - year 2 - semester 1 - repeat\games programming\maroonedca2\maroonedca2\inventory.h   17  1   MaroonedCA2
Error   3   error C2511: 'std::string Inventory::add(std::string)' : overloaded member function not found in 'Inventory'    c:\users\conor\documents\college\dkit - year 2 - repeat\dkit - year 2 - semester 1 - repeat\games programming\maroonedca2\maroonedca2\inventory.cpp 19  1   MaroonedCA2

4 个答案:

答案 0 :(得分:3)

string来自std名称空间

变化

std::string add(string item);

std::string add(std::string item);

可以增强一些地方:

    在Inventory.cpp中
  1. ,最好不要using namespace std;,为std::vectorstd::string等变量提供完整的命名空间。

  2. vector<string> inventory;可以在Inventory calss

  3. 中移动

答案 1 :(得分:1)

您的问题在标题中,而您缺少using namespace std。我永远不会使用此命令。我认为明确你的命名空间必须更好,你会避免这样的问题。

// Compiler knows what std::string is, but not string on it's own.
std:: string add(string item);

如果是我的项目,我会移除using namespace std并在任何地方使用std::

此外,你没有正确使用你的课程。您有成员方法在.cpp文件中对全局变量进行操作。

vector<string> inventory;

应该是Inventory类的私人会员

<强> Iterarors

为了解决你的意见,我想说的是你不需要声明这样的迭代器来使用它们,除非你需要存储一个迭代器供以后使用(用于某种原因。虽然迭代器无效时可能会有危险)。您可以通过以下几种方式使用它们。

<强>的typedef

使用typedef可以让您的生活更轻松。

typedef std::vector<std::string> StringVec;
typedef StringVec::iterator StringVecIter;

现在你可以在循环中使用它们了。

for(StringVecIter it = inventory.begin(); iter != inventory.end(); ++it)
{ ... }

自动

执行这些循环的更简单方法是使用auto关键字。编译器为变量分配适当的类型,在本例中为std::vector<std::string>::iterator

for(auto it = inventory.begin(); it != inventory.end(); ++it)
{ ... }

答案 2 :(得分:1)

摆脱using namespace std;语句(你永远不应该使用它!)并正确限定你正在使用的命名空间项目,例如:

<强> Inventory.h

#ifndef INVENTORY_H
#define INVENTORY_H
#include <string>

class Inventory
{
public:
    //Constructor
    Inventory();

    //Methods.
    std::string add(std::string item);
    void displayInventory();
    void showInventory();
private:
    //Data members
};

#endif //INVENTORY_H

<强> Inventory.cpp

#include "Inventory.h"
#include <iostream>
#include <vector>   //  To enable the use of the vector class.
#include <string>
#include <algorithm>

std::vector<std::string> inventory;

Inventory::Inventory()
{
}

std::string Inventory::add(std::string item)
{
    inventory.push_back(item);
    return item;
}

void Inventory::showInventory()
{
    char input[80];
    std::cin >> input;
    char inventoryRequest[] = "i";
    //compare the player input to inventoryRequest (i) to see if they want to look at inventory.
    if (strcmp(input, inventoryRequest) == 0)
    {
        displayInventory();
    }
}

void displayInventoryItem(const std::string &item)
{
    std::cout << item << std::endl;
}

void Inventory::displayInventory()
{
    std::cout << "You have " << inventory.size() << " items." << std::endl;
    std::cout << std::endl;
    std::cout << "******Inventory******" << std::endl;
    std::cout << "Your items:" << std::endl;
    std::for_each(inventory.begin(), inventory.end(), displayInventoryItem);
}

答案 3 :(得分:-1)

将您的库存,myIterator和Iter放入您的班级库中。