2017-01-16 1 views
1

Я создал класс под названием «Item» и класс под названием «Комната», и есть вектор для типов элементов, называемых «Предметы» внутри комнаты. Я добавил несколько элементов в вектор Item и попытался создать геттер для этого элемента Vector. Теперь я пытаюсь распечатать 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»:: GetItems ': нестандартный синтаксис; использовать '&', чтобы создать указатель на член ConsoleApplication25 D: \ tiltan \ Visual Studio \ ownclasses \ номер + пункт + дверь \ consoleapplication25 \ main.cpp 51

Я также попытался:

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

    cout << endl; 

который Безразлично 't дать ошибку, но просто печатает пустую строку. и:

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

    cout << endl; 

знаменующий моей < < с красной линией, и мне не говорит ни один оператор «< <» соответствует этим операнды ... Как я идти об этом? Я действительно не настолько продвинутый и не знаю много сложных функций и кодов, а также, пожалуйста, постарайтесь быть такими же простыми, как и у меня. Я тоже новичок здесь, так что извините, если я не размещаю и не объясняю себя правильно ...

EDIT: за каждый запрос - я добавляю 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

для этого cout << FunStoneRoom.GetItems() [VectorPos]; для работы вам нужно переопределить оператор << для класса Item – user1438832

+0

не уверен, что это значит. –

+0

Пожалуйста, покажите нам, как определяется Item. –

ответ

0

С первым беспокойством, которое я цитирую здесь ....

Room FunStoneRoom = Room(); 

FunStoneRoom.AddItem(ItemCharcoal); 

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

cout << endl; 

Это дает мне ошибку: Тяжесть Код Описание проекта Line File Suppression State Error 'Room :: GetItems' C3867: не -стандартный синтаксис; используйте '&' для создания указателя на элемент 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 << в петлю. Это заставляет компилятор попытаться найти и вызвать функцию operator<<() для записи Item в выходной поток. Ваш код не объявляет такую ​​функцию, поэтому компилятор не может ее найти.

Вам необходимо создать такую ​​функцию. Он должен быть объявлен в item.h и определен (реализован) в item.cpp. Эти файлы не содержат таких объявлений.

Теперь мы обратимся к вашей просьбе о помощи (которую я уже вам дал).

Как это сделать? Я на самом деле не настолько продвинутый и не знаю много сложных функций и кодов, и, конечно же, старайтесь быть такими же простыми, как и у меня.

Я собираюсь быть тупым. Вы являетесь причиной своих собственных проблем.

Во-первых, вы не прилагаете достаточных усилий для интерпретации того, что компилятор пытается вам рассказать. Компиляторы - это неосведомленные части программного обеспечения, но по своему невежеству они довольно последовательно жалуются на конкретные типы ошибок. Поэтому вам необходимо приложить усилия для понимания сообщений об ошибках вашего компилятора. Если вы этого не сделаете, вы никогда не сможете исправить свой собственный код, когда компилятор откажется от него.

Тогда вы усугубляете свои проблемы путем случайного изменения кода в надежде на его исправление, а не на принятие обоснованных изменений. Результатом этого является либо поведение, которое вы не понимаете (если код компилируется и запускается), либо сообщения об ошибках от вашего компилятора, которые вы не понимаете, если вы не понимаете, какое изменение вы действительно сделали.

Когда вы имеете дело с подтвержденным ignoramus (компилятором), вы не можете позволить себе быть невежественным.

+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

Элемент it = FunStoneRoom.GetItems() [VectorPos]; затем cout << это. GetItemName() << "" << it. GetItemDescription() << епсИ; – user1438832

+0

, но я не хочу, чтобы имя и описание отображались, просто список самих элементов. как то, что вектор содержит в каждой позиции ... например ItemSword = Item (Меч, очень длинный), ItemAxe = Item (Ax, очень короткий) , то вектор имеет ItemSword в позиции 0 и ItemAxe в позиции 1, ll print: ItemSword ItemAxe –

Смежные вопросы