0

インベントリ用のヘッダーと .cpp ファイルをセットアップしました。ベクトルを使用しています。ベクトル ライブラリに付属する push/ または pop メソッドを使用できません。メインで使いたい。また、メインのベクターに追加できるように作成した add メソッドで 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

在庫.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

4 に答える 4

3

stringstd名前空間からです

変化する

std::string add(string item);

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

いくつかの場所を強化できます。

  1. Inventory.cpp では、などusing namespace std;の変数に完全な名前空間を提供しない方がよいでしょう。std::vectorstd::string

  2. vector<string> inventory;Inventory 内で移動可能

于 2012-11-22T02:29:33.477 に答える
1

ステートメントを削除しusing namespace std;(絶対に使用しないでください!)、使用している名前空間のアイテムを適切に修飾します。たとえば、次のようになります。

在庫.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

在庫.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);
}
于 2012-11-22T02:35:48.647 に答える
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

イテラー

あなたのコメントに対処するために、私が言おうとしているのは、後で使用するためにイテレーターを保存する必要がない限り、イテレーターを使用するためにそのようなイテレーターを宣言する必要はないということです (何らかの理由でイテレーターが無効)。それらを使用できるいくつかの方法を次に示します。

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)
{ ... }
于 2012-11-22T02:30:22.283 に答える
-1

インベントリ、myIterator、および Iter をクラス Inventory 内に配置します。

于 2012-11-22T02:31:16.273 に答える