繁体   English   中英

我正在尝试通过打印它来检查类向量的getter是否正常工作但是它不起作用

[英]I'm trying to check if a getter for a class vector is working by printing it but it won't work

我创建了一个名为“Item”的类和一个名为“Room”的类,在Room中有一个名为“Items”的Item类型的向量。 我在项目向量中添加了一些项目,并尝试为该项目向量创建一个getter。 现在我正在尝试打印吸气剂,看它是否确实得到了我想要的但是当我尝试一种方式时它给我一个错误信息或者当我尝试不同的方式时只打印任何东西。 我究竟做错了什么?

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'Room :: GetItems':非标准语法; 使用'&'创建指向成员的指针ConsoleApplication25 d:\\ tiltan \\ visual studio \\ ownclasses \\ room + item + door \\ 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;
}

一个示例是 -

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

关于你的第一个问题,我在这里引用....

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

这给了我一个错误:严重性代码描述项目文件行抑制状态错误C3867'Room :: GetItems':非标准语法; 使用'&'创建指向成员的指针ConsoleApplication25 d:\\ tiltan \\ 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 这些文件不包含此类声明。

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

我该怎么做? 我真的不是那么先进,也不知道很多复杂的功能和代码,所以请尽量让我和你一样简单。

我会直言不讳。 你在这里是你自己问题的原因。

首先,您没有花足够的精力来解释编译器试图告诉您的内容。 编译器是无知的软件,但由于他们的无知,他们对特定类型的错误抱怨相当一致。 因此,您需要努力了解编译器的错误消息。 如果不这样做,当编译器拒绝它时,您将永远无法修复自己的代码。

然后,您通过随机更改代码来复合您的问题,希望修复它,而不是进行合理的更改。 结果是您不理解的行为(如果代码编译并运行)或编译器中您不理解的错误消息,除非您了解实际所做的更改。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM