我正在尝试通过打印来检查 getter for a class vector 是否正常工作,但它不起作用

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

我制作了一个名为 "Item" 的 class 和一个名为 "Room" 的 class 并且在 Room 中有一个名为 "Items" 的项目类型向量。 我在 Item 向量中添加了一些 Item 并尝试为该 Item Vector 创建一个 getter 。现在我正在尝试打印 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 之类的东西,看起来这些项目正确地包含在向量中。现在我不确定如何为它打印 getter...试试这个:

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;

This gives me an error : Severity Code Description Project File Line Suppression State Error C3867 'Room::GetItems': non-standard syntax; use '&' to create a pointer to member ConsoleApplication25 d:\tiltan\visual studio\ownclasses\room+item+door\consoleapplication25\main.cpp 51

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

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

I also tried:

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

cout << endl;

which doesn't give an error but just prints an empty line.

在这种情况下,您看到的行为是正确的。在循环中,您已经删除了 cout <<,但仍然惊讶于它没有产生任何输出。 Room::GetItems() 不产生输出 - 它 returns 一个 std::vector<Item>。使用 operator[]() 从向量中检索元素,获取对相应 Item 的引用,因此也不会产生输出。

and:

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

cout << endl;

which marks my << with a red line and tells me no operator "<<" matches these > operands...

此处的代码与前面的代码相同,只是循环中有 re-inserted 和 cout <<。这会导致编译器尝试查找并调用 operator<<() 函数以将 Item 写入输出流。你的代码没有声明这样的函数,所以编译器找不到它。

您需要创建这样的函数。需要在item.h中声明,在item.cpp中定义(实现)。这些文件不包含此类声明。

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

How do i go about this? I'm really not that advanced and don't know a lot of complicated functions and codes and whatnot so please try to be as simple as u can with me.

我要直言不讳。你是你自己问题的根源。

首先,您没有投入足够的精力来解释编译器试图告诉您的内容。编译器是一些无知的软件,但在他们的无知中,他们相当一致地抱怨特定类型的错误。因此,您需要努力理解编译器的错误消息。否则,当编译器拒绝时,您将永远无法修复自己的代码。

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

当你与一个确定的无知者(编译器)打交道时,你不能无知。