J'ai créé une classe appelée "Item" et une classe appelée "Room" et il y a un vecteur pour les types d'éléments appelé "Items" à l'intérieur de Room. J'ai ajouté quelques éléments dans le vecteur d'élément et j'ai essayé de créer un getter pour ce vecteur d'élément. Maintenant, j'essaie d'imprimer le getter pour voir s'il a vraiment obtenu ce que je voulais, mais cela me donne un message d'erreur lorsque j'essaye dans un sens ou n'imprime simplement rien lorsque j'essaye d'une manière différente. Qu'est-ce que je fais mal?

Room.h a quelques trucs ainsi que ces lignes de code:

.....
///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 a des éléments qui définissaient les salles par défaut et surchargées et ont donné aux salles des éléments et les a également:

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

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

Main.cpp a des push.backs et des trucs et il semble que les éléments sont correctement contenus dans le vecteur. Maintenant, je ne sais pas comment imprimer le getter pour cela ... en essayant ceci:

Room FunStoneRoom = Room();

    FunStoneRoom.AddItem(ItemCharcoal);

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

    cout << endl;

Cela me donne une erreur: Code de gravité Description Erreur d'état de suppression de ligne de fichier de projet C3867 «Room :: GetItems»: syntaxe non standard; utilisez '&' pour créer un pointeur vers le membre ConsoleApplication25 d: \ tiltan \ visual studio \ ownclasses \ room + item + door \ consoleapplication25 \ main.cpp 51

J'ai aussi essayé:

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

    cout << endl;

Qui ne donne pas d'erreur mais imprime juste une ligne vide. et:

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

    cout << endl;

Qui marque mon << avec une ligne rouge et me dit qu'aucun opérateur "<<" ne correspond à ces opérandes ... Comment dois-je procéder? Je ne suis vraiment pas si avancé et je ne connais pas beaucoup de fonctions et de codes compliqués, etc., alors essayez d'être aussi simple que possible avec moi. Je suis aussi nouveau ici, donc désolé si je ne poste pas ou ne m'explique pas correctement ...

EDIT: par demandé - j'ajoute item.h et item.cpp mais rappelez-vous que je n'ai pas besoin de savoir ce qu'ils contiennent, seulement une liste des éléments dans le vecteur: 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
Mr.Trainee 16 janv. 2017 à 07:29

2 réponses

Meilleure réponse

Avec votre première préoccupation, que je cite ici ...

Room FunStoneRoom = Room();

FunStoneRoom.AddItem(ItemCharcoal);

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

cout << endl;

Cela me donne une erreur: Code de gravité Description Erreur d'état de suppression de ligne de fichier de projet C3867 «Room :: GetItems»: syntaxe non standard; utilisez '&' pour créer un pointeur vers le membre ConsoleApplication25 d: \ tiltan \ visual studio \ ownclasses \ room + item + door \ consoleapplication25 \ main.cpp 51

Dans ce cas, la cause est un () manquant à l'appel de GetItems. Le compilateur traite cela comme une tentative d'obtenir un pointeur vers la fonction membre Room::GetItems (car une syntaxe similaire, lorsqu'elle est appliquée à des fonctions non membres, convertit le nom d'une fonction en un pointeur vers cette fonction). C'est une erreur, car les pointeurs vers la fonction membre ne sont pas obtenus de cette façon.

Avec votre deuxième préoccupation, que je cite ici

J'ai aussi essayé:

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

cout << endl;

qui ne donne pas d'erreur mais imprime juste une ligne vide.

Dans ce cas, le comportement que vous voyez est correct. Dans la boucle, vous avez supprimé le cout <<, mais vous êtes toujours surpris qu'il ne produise aucune sortie. Room::GetItems() ne produit pas de sortie - il renvoie un std::vector<Item>. Récupérer un élément d'un vecteur, en utilisant operator[](), obtient une référence au Item correspondant, donc ne produit pas non plus de sortie.

et:

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

cout << endl;

qui marque mon << avec une ligne rouge et me dit qu'aucun opérateur "<<" ne correspond à ces> opérandes ...

Le code ici est le même que le lot précédent, sauf que vous avez réinséré le cout << dans la boucle. Cela amène le compilateur à essayer de trouver et d'appeler une fonction operator<<() pour écrire un Item dans un flux de sortie. Votre code ne déclare pas une telle fonction, donc le compilateur ne peut pas la trouver.

Vous devez créer une telle fonction. Il doit être déclaré dans item.h et défini (implémenté) dans item.cpp. Ces fichiers ne contiennent pas de telles déclarations.

Maintenant, nous venons à votre appel à l'aide (que je vous ai déjà donné).

Comment dois-je procéder? Je ne suis vraiment pas si avancé et je ne connais pas beaucoup de fonctions et de codes compliqués, etc., alors essayez d'être aussi simple que possible avec moi.

Je vais être franc. Vous êtes la cause de vos propres problèmes ici.

Premièrement, vous ne faites pas assez d'efforts pour interpréter ce que le compilateur essaie de vous dire. Les compilateurs sont des logiciels ignorants mais, dans leur ignorance, ils se plaignent assez régulièrement de certains types d'erreurs. Vous devez donc faire des efforts pour comprendre les messages d'erreur de votre compilateur. Si vous ne le faites pas, vous ne pourrez jamais corriger votre propre code lorsqu'un compilateur le rejette.

Ensuite, vous aggravez vos problèmes en changeant de code au hasard dans l'espoir de le résoudre, plutôt que de faire des changements raisonnés. Le résultat de cela est soit un comportement que vous ne comprenez pas (si le code se compile et s'exécute), soit des messages d'erreur de votre compilateur que vous ne comprendrez pas, à moins que vous ne compreniez la modification que vous avez réellement apportée.

Lorsque vous avez affaire à un ignorant confirmé (le compilateur), vous ne pouvez pas vous permettre d'être ignorant.

0
Peter 16 janv. 2017 à 08:25

Un exemple d'exemple est -

#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
user1438832 16 janv. 2017 à 05:23