2014-09-26 4 views
0

Так что я класс определяется как такойКакова должна моя функция?

template<class ItemType> 
class Bag : public BagInterface<ItemType> 
{ 
public: 
    Bag(); 
    Bag(const ItemType &an_item); // contrusctor thats constructs for a signal item. 
    int GetCurrentSize() const; 
    bool IsEmpty() const; 
    bool Add(const ItemType& new_entry); 
    bool Remove(const ItemType& an_entry); 
    void Clear(); 
    bool Contains(const ItemType& an_entry) const; 
    int GetFrequencyOf(const ItemType& an_entry) const; 
    vector<ItemType> ToVector() const; 

private: 
    int GetIndexOf(const ItemType& target) const; 
    static const int kDefaultBagSize_ = 6; 
    ItemType items_[kDefaultBagSize_]; // array of bag items 
    int item_count_;     // current count of bag items 
    int max_items_;     // max capacity of the bag 

и мой профессор конкретно спросить, что мы используем функцию

void DisplayBag(const Bag<ItemType> &a_bag); 

для отображения содержимого в сумке, проблема заключается в том, что я не имею понятия, как чтобы заставить его работать. Например, в моем Int магистральный я есть

Bag<string> grabBag; 
grabBag.Add(1); 
Display(grabBag); 

тогда в моей функции дисплея у меня есть.

void DisplayBag(const Bag<ItemType> &a_bag) 
{ 
    int j = 6; 
    for(int i = 0; i < j; i++) 
    { 
     cout << a_bag[i] << endl; 
    } 
} 

Я попытался испортить этот код несколькими способами и ничего не работает. У меня

void DisplayBag(const Bag<ItemType> &a_bag); 

Заявленный до моего ИНТ основной(), а сама функция она написана в том же файле заголовка реализации класса.

вектор-функция

template<class ItemType> 
vector<ItemType> Bag<ItemType>::ToVector() const 
{ 
    vector<ItemType> bag_contents; 
    for (int i = 0; i < item_count_; i++) 
    bag_contents.push_back(items_[i]); 
    return bag_contents; 
} // end toVector 
+4

Это определение класса кажется подозрительным; почему у 'Bag' есть метод отображения * другой *' Bag'? –

+1

Вы уверены, что 'DisplayBag' не означает' static'? –

+1

@OliverCharlesworth: Обратите внимание на использование слова «профессор». – Beta

ответ

3

Для того, чтобы отобразить содержимое Bag, функция DisplayBag должна быть в состоянии выяснить, что содержимое являются. Единственная функция, которую я вижу, с помощью которой она может это сделать, - vector<ItemType> ToVector() const;. После того, как вы получили vector<ItemType> от этой функции, вы сможете отображать данные путем итерации через элементы vector<ItemType>. (Вы будет иметь возможность использовать синтаксис [i] тогда, потому что vector определяет operator[].)

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

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

+0

К сожалению, опыт заставляет меня поверить, что профессор, вероятно, не научит, как это сделать позже. – o11c

+0

Благодарим вас за ответ.Большая часть этого материала для меня очень новая, и меня не учат тому, что именно является шаблонами, и не получили достаточного опыта работы с конструкторами. Поэтому я полагаю, что нужно делать 'grabBag.ToVector();' then 'DisplayBag (grabBag)'? Я попробовал это, и 'operator []' все еще не определен. – anonuser1234

+0

Итак, мне удалось заставить его работать, объявив \t 'vector someVector = grabBag.ToVector();' и затем 'DisplayBag (someVector);' но мне пришлось изменить свой начальный 'void DisplayBag (const Bag & a_bag); 'to ' void DisplayBag (const vector & a_bag); 'все равно сохранить его как сумку? – anonuser1234