2017-01-16 34 views
1

我做了一个名为“Item”的类和一个名为“Room”的类,并且有一个用于Item类型的矢量房间内的“物品”。 我在物品矢量中添加了一些物品,并尝试为该物品矢量制作一个吸气剂。现在我试图打印吸气剂,看看它是否真的得到了我想要的,但是当我尝试一种方法时,它给了我一个错误信息,或者当我尝试不同的方式时,什么也不打印。我究竟做错了什么?我想检查一个类矢量的吸气工作是通过打印工作,但它不会工作

Room.h有一些东西,以及这些代码:

..... 
///Getters 

//get a list of the items currently in the room 
vector<Item> GetItems(); 

private: 

///properties 

string RoomName; 
string RoomDescription; 
vector <Door> Doors; 
vector <Item> Items; 

Room.cpp有事情,定义的默认和重载的房间和房间了一些项目,也有这些:

vector<Item>Room::GetItems() 
{ 
    return Items; 
} 

int Room::GetItemAmount() 
{ 
    return Items.size(); 
} 

main.cpp有一些push.backs和东西,它似乎是正确包含在向量中的项目。现在,我不知道如何打印消气吧吧...尝试此:

Room FunStoneRoom = Room(); 

    FunStoneRoom.AddItem(ItemCharcoal); 

     for (unsigned int VectorPos = 0; VectorPos < FunStoneRoom.GetItemAmount(); VectorPos++) 
     { 
      cout << FunStoneRoom.GetItems[VectorPos] << " "; 
     } 

    cout << endl; 

这给了我一个错误: 严重性代码说明项目文件的线路抑制状态 错误C3867“客房:: GetItems ':非标准语法;使用 '&' 创建一个指针构件ConsoleApplication25 d:\ tiltan \视觉工作室\ ownclasses \室温+ +项门\ consoleapplication25 \ main.cpp中51

我也尝试:

for (unsigned int VectorPos = 0; VectorPos < FunStoneRoom.GetItemAmount(); VectorPos++) 
     { 
      FunStoneRoom.GetItems()[VectorPos]; 
     } 

    cout << endl; 

其没有按给出一个错误,但只是打印一个空行。 和:

for (unsigned int VectorPos = 0; VectorPos < FunStoneRoom.GetItemAmount(); VectorPos++) 
     { 
      cout << FunStoneRoom.GetItems()[VectorPos]; 
     } 

    cout << endl; 

这标志着我< <有一个红色的线,并告诉我没有操作员“< <”这些操作数相匹配... 我怎么去呢? 我真的没那么先进,不知道很多复杂的功能和代码,所以请尽量简单,因为你可以跟我在一起。 我在这里也很新很抱歉,如果我没有发布或正确解释自己...

编辑:每请求 - 我添加item.h和item.cpp,但记住我不需要知道它们包含的内容,只是在载体的项目清单: item.h:

#pragma once 
#include <string> 
#include <iostream> 

using namespace std; 

class Item 
{ 
public: 

    ///constructors 
    Item(); //default item 


    ///overloadeds 

    //overloaded customizable items 
    // @param string = Item Name 
    // @param string = Item Description 
    Item(string, string); 


    ///destructors 
    ~Item(); 

    ///methods 

    //Display item name and description 
    void ViewItem(); 

    //Set a new Item Description 
    void SetItemDescription(string); 

    //Set a new Item Name 
    void SetItemName(string); 

    //Get an Item's name 
    string GetItemName(); 

    //Get an Item's description 
    string GetItemDescription(); 



private: 

    ///properties 

    string ItemName; 
    string ItemDescription; 

}; 

item.cpp:

#include "Item.h" 



Item::Item() 
{ 

    Item::ItemName = "Non Material Item"; 
    Item::ItemDescription = "You cannot see, feel, taste, smell or hear this item"; 

} 


Item::Item(string NewItemName, string NewItemDesc) 
{ 

    NewItemName[0] = toupper(NewItemName[0]); 
    Item::ItemName = NewItemName; 
    Item::ItemDescription = NewItemDesc; 


} 


Item::~Item() 
{ 

} 


void Item::ViewItem() 
{ 

    cout << ItemName << endl; 
    cout << ItemDescription << endl; 

} 

void Item::SetItemDescription(string NewItemDescription) 
{ 

    if (NewItemDescription.length() < 100) 
    { 
     NewItemDescription[0] = toupper(NewItemDescription[0]); 
     ItemDescription = NewItemDescription; 
    } 

    else 
    { 
     ItemDescription = "This Item's description is too long"; 
    } 
} 


void Item::SetItemName(string NewItemName) 
{ 

    if (NewItemName.length() < 30) 
    { 
     NewItemName[0] = toupper(NewItemName[0]); 
     ItemName = NewItemName; 
    } 

    else 
    { 
     ItemDescription = "This Item's name is too long"; 
    } 

} 

string Item::GetItemName() 
{ 
    return ItemName; 
} 

string Item::GetItemDescription() 
{ 
    return ItemDescription; 
} 
+1

for this cout << FunStoneRoom.GetItems()[VectorPos];为了工作,你需要重写项目类 – user1438832

+0

的<<操作符不确定这是什么意思.. –

+0

请告诉我们如何定义项目。 –

回答

0

有了您首先关注的,这是我在这里引用....

Room FunStoneRoom = Room(); 

FunStoneRoom.AddItem(ItemCharcoal); 

for (unsigned int VectorPos = 0; VectorPos < FunStoneRoom.GetItemAmount(); VectorPos++) 
{ 
     cout << FunStoneRoom.GetItems[VectorPos] << " "; 
} 

cout << endl; 

这给了我一个错误:严重性代码说明项目文件的线路抑制状态错误C3867“室​​:: GetItems”:无标准语法;使用'&'创建一个指向会员ConsoleApplication25的指针d:\ tilan \ visual studio \ ownclasses \ room + item + door \ consoleapplication25 \ main。cpp 51

在这种情况下,原因是在呼叫GetItems时缺少()。编译器将此视为尝试获取指向成员函数Room::GetItems的指针(因为类似语法应用于非成员函数时,会将函数的名称转换为指向该函数的指针)。这是一个错误,因为指向成员函数的指针不是以这种方式获得的。

随着你的第二个问题,我在这里引用

我也试过:

for (unsigned int VectorPos = 0; VectorPos < FunStoneRoom.GetItemAmount(); VectorPos++) 
{ 
     FunStoneRoom.GetItems()[VectorPos]; 
} 

cout << endl; 

不给一个错误,但只是打印一个空行。

在这种情况下,您看到的行为是正确的。在循环中,您已经删除了cout <<,但仍然感到惊讶的是它没有输出。 Room::GetItems()不产生输出 - 它返回std::vector<Item>。从矢量检索元素,使用operator[]()获得对应的Item的引用,所以也不会产生输出。

和:

for (unsigned int VectorPos = 0; VectorPos < FunStoneRoom.GetItemAmount(); VectorPos++) 
{ 
     cout << FunStoneRoom.GetItems()[VectorPos]; 
} 

COUT < < ENDL;

其中有一个红色的线标志着我< <,并告诉我没有操作员“< <”这些>操作数相匹配...

这里的代码是一样的以前的很多,除非你已经重新 - 在循环中插入cout <<。这会导致编译器尝试查找并调用operator<<()函数以将Item写入输出流。你的代码没有声明这样的函数,所以编译器找不到它。

您需要创建这样的功能。它需要在item.h中声明并在item.cpp中定义(实施)。这些文件不包含这样的声明。

现在我们来请求帮助(我已经给你了)。

我该如何解决这个问题?我真的没有那么先进,也不知道很多复杂的功能和代码,所以请尽量简单,因为你可以跟我在一起。

我会变钝的。你在这里是你自己的问题的原因。

首先,你没有足够的努力来解释编译器试图告诉你什么。编译器是一些无知的软件,但是在他们的无知中,他们对于特定类型的错误抱怨得相当一致。所以你需要努力去理解编译器的错误信息。如果你不这样做,当编译器拒绝它时,你将永远无法修复你自己的代码。

然后,您通过随机更改代码来修复问题,以期修复它,而不是进行合理的更改。这样做的结果是你不理解的行为(如果代码编译并运行)或者编译器的错误消息,你不会理解,除非你了解你实际做出的改变。

当你处理确认的无知(编译器)时,你不能无知。

+0

嘿,谢谢你的长答案。当我读到你写的所有东西时,尤其是第二部分关于返回物品但不知道如何打印它的整个事情。我决定在函数的末尾添加“.GetItemName()”(cout << FunStoneRoom.GetItems()[VectorPos] .GetItemName();)它可能不会给我实际的Item容器的名字,但它会打印出所有的矢量中项目的名称。这不完全是我想要的,但考虑到我缺乏关于如何执行您所提及的“操作符<<”的知识,这很不错。非常感谢! –

0

样本的例子是 -

#include <iostream> 
using namespace std; 

class Item 
{ 
    int id; 
    string description; 
public: 
    Item(int id,string description) 
    { 
     this->id=id; 
     this->description=description; 
    } 
    friend ostream& operator<<(ostream& os, const Item& it); 
}; 

ostream& operator<<(ostream& os, const Item& it) 
{ 
    os << "Id : " << it.id << " Description : " <<it.description<<endl; 
    return os; 
} 

int main() 
{ 
    Item it(5, " calculator"); 
    cout << it; 
} 
+0

这对我来说太复杂了,我不知道这些东西是什么意思...... 是否有东西不包含这些“朋友”和“操作符”以及“这个”和“ostream”的东西? –

+0

Item it = FunStoneRoom.GetItems()[VectorPos];然后cout << it。 GetItemName()<<“”<< it。 GetItemDescription()<< ENDL; – user1438832

+0

但我不想显示名称和描述,只是项目本身的列表。像什么矢量包含在每个位置... 例如ItemSword = Item(剑,很长),ItemAxe = Item(Ax,非常短) 然后该矢量在位置0处有ItemSword,在位置1处有ItemAxe,将会打印:ItemSword ItemAxe –