【问题标题】:What is my function supposed to call?我的函数应该调用什么?
【发布时间】:2014-11-21 22:37:33
【问题描述】:

所以我有一个这样定义的类

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 main 我有

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);

在我的 int main() 和函数本身之前声明,它写在类实现的同一个头文件中。

向量函数

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

【问题讨论】:

  • 这个类的定义似乎很可疑;为什么Bag 会有显示另一个 Bag 的方法?
  • 你确定DisplayBag 不是static
  • @OliverCharlesworth:注意“教授”这个词的使用。
  • 如果你想让grabBag显示自己的内容,那么根据界面你可以调用grabBag.Display(grabBag);。是的,这有点奇怪,但是你有一个奇怪的界面(如之前的 cmets 所述)。
  • @DavidK,我现在意识到我不应该在类中添加 displaybag() 函数。但现在我不知道下一步该做什么。那么我所有的内容都在a_bag 中的grabBag 中吗?我似乎无法从中调用任何东西。

标签: c++ function class templates abstract-data-type


【解决方案1】:

为了显示Bag 的内容,函数DisplayBag 必须能够找出内容是什么。我看到的唯一可以做到这一点的函数是vector&lt;ItemType&gt; ToVector() const;。一旦你从这个函数中得到一个vector&lt;ItemType&gt;,你应该能够通过遍历vector&lt;ItemType&gt;的元素来显示数据。 (您能够使用[i] 语法,因为vector 定义了operator[]。)

当然,与此同时,您必须在新数据结构中复制Bag 中的所有内容,以便显示它。

我真诚地希望这个练习的目的是给你一个实物课 糟糕的界面设计的后果,你的教授计划展示 以后你应该如何编写这个界面

【讨论】:

  • 不幸的是,经验让我相信教授以后可能不会教如何正确地做到这一点。
  • 感谢您的回答。这些东西中的大部分对我来说都是很新的东西,我还没有被告知究竟什么是模板,也没有获得足够的构造函数经验。那么我应该先做grabBag.ToVector(); 然后DisplayBag(grabBag) 吗?我试过了,operator[] 仍然未定义。
  • 好的,所以我设法通过声明 vector&lt;string&gt; someVector = grabBag.ToVector(); 然后 DisplayBag(someVector); 让它工作,但我必须将我最初的 void DisplayBag(const Bag&lt;ItemType&gt; &amp;a_bag); 更改为 void DisplayBag(const vector&lt;ItemType&gt; &amp;a_bag); 以保持它作为一个包?跨度>
  • 没关系,我通过在显示功能中添加vector&lt;string&gt; new_vector = a_bag.ToVector(); 解决了这个问题。谢谢你的一切!
猜你喜欢
  • 2015-09-24
  • 2019-09-18
  • 1970-01-01
  • 2020-10-22
  • 1970-01-01
  • 2019-11-04
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
相关资源
最近更新 更多