2

嘿,我使用了一个向量加上它的迭代器。我将它与 Inventory.cpp 一起放在 Inventory.h 文件中。我想知道我可以直接调用它,这样我就可以访问向量库函数,如推送、弹出等......因为目前我不能。有人可以帮我弄这个吗。

这是我的代码:

库存.h

//-------------------------------------------------------------------------------
//  Inventory.h
//-------------------------------------------------------------------------------

#ifndef INVENTORY_H
#define INVENTORY_H
#include <string>
#include <vector>

using namespace std; 
class Inventory
{
public:
    //Constructor
    Inventory();

    //Methods.
    string add(string item);
    void displayInventory();
    void showInventory();
private:
    //Data members
   vector<string> inventory;
   vector<string>::iterator myIterator;
   vector<string>::const_iterator iter;
    };


#endif //INVENTORY_H

库存.cpp

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


using namespace std;



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

我想能够做什么:

int main()
{
Inventory inventory;
inventory.push_back();


}

错误

Error   2   error LNK2019: unresolved external symbol "public: class std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > & __thiscall Inventory::GetContainer(void)" (?GetContainer@Inventory@@QAEAAV?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@XZ) referenced in function _main   C:\Users\Conor\Documents\College\DKIT - Year 2 - Repeat\DKIT - Year 2 - Semester 1 - Repeat\Games Programming\MaroonedCA2\MaroonedCA2\Main.obj  MaroonedCA2
Error   3   error LNK1120: 1 unresolved externals   C:\Users\Conor\Documents\College\DKIT - Year 2 - Repeat\DKIT - Year 2 - Semester 1 - Repeat\Games Programming\MaroonedCA2\Debug\MaroonedCA2.exe MaroonedCA2
4

3 回答 3

1

您可以从 std::vector 继承您的类:

class Inventory : public std::vector<std::string> {
   public:
      Inventory();
      void displayInventory();
      void showInventory();
      // [...] 
}

然后在您的代码中,您应该能够执行以下操作:

int main()
{
    Inventory inv;
    inv.push_back("item 1");
    inv.push_back("item 2");
    for (Inventor::iterator it = inv.begin(); it != inv.end(); ++it)
           std::cerr << *it << ' ';
    std::cerr << std::endl;
}

通过继承可以避免重新定义方法、迭代器等。

于 2012-11-23T13:53:41.217 回答
1

一个简单的解决方案是添加 apush_back和要复制到清单类的其他向量方法:

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

    //Methods.
    std::string add(std::string item);
    void displayInventory();
    void showInventory();
    void push_back(const std::string& s) { inventory.push_back(s); }
private:
    //Data members
   std::vector<std::string> inventory;
   std::vector<std::string>::iterator myIterator;
   std::vector<std::string>::const_iterator iter;
};

请注意,私有继承std::vector也可能是一种选择。它不是 100% 安全的,但很难找到可能造成问题的场景。公开继承是绝对禁忌。这个例子展示了如何暴露部分std::vector私有继承的公共接口:

class Inventory : private std::vector<std::string>
{
 public:
  // make a selection of the vector's methods public for this class.
  using std::vector<std::string>::push_back;
  using std::vector<std::string>::pop_back;
  using std::vector<std::string>::begin;
  using std::vector<std::string>::end;
};
于 2012-11-23T14:36:54.153 回答
0

此代码段有许多问题/改进领域。但是,对于您询问的具体问题,请注意“push_back”不是 Inventory 类的成员函数。所以你得到了编译器错误。

您需要为此调用 inventory.add 。

于 2012-11-23T13:51:07.437 回答