-1

如何访问变量itemtype和函数totalincrement?我下面的代码给了我如下错误

Counter2.h:在成员函数'int Counter::increment(T)'中:

Counter2.h:28:31: 错误: 'itemtype' 未在此范围内声明

Counter2.h:36:22: 错误: 'itemtype' 未在此范围内声明

Counter2.h:36:39:错误:未在此范围内声明“总计”

我必须能够使用Counter<T> counter;T 可以是任何类型的命令,例如字符串和counter.increment()

#include<string>
//#include<cstdlib>
#include<vector>

using std::vector;
using std::string;

template<class T>
class Record{
   public:
      T itemtype;
      int total;   
};

template<class T>
class Counter{
      vector< Record<T> > data;
   public:
      int increment(T item);
      int count(T item);
      void printSummary();
};

template<class T>
int Counter <T> :: increment(T item){
   bool check = false;

   for(int i=0; i < data.size(itemtype); i++){
      if(data[i].itemtype == item){
         data[i].total++;
         bool check = true;
         break;
      }
   }
   if(check == false){
      data.push_back(itemtype = item, total = 1);
   }
}

int main(){

   Counter<string> counter;   

   counter.increment("orange");
   counter.increment("orange");

   return 0;
}
4

3 回答 3

0

我不太确定我是否了解您在这里的目的,尽管首先您正在尝试访问 Record 类的私有成员。您可以记录一个结构(默认情况下为公共),或提供 getter/setter 或添加:

friend class Counter;

记录以便 Counter 可以访问其私有成员。

于 2013-04-11T12:57:55.840 回答
0

您可以Record在内部创建一个私有结构Counter。这不会暴露它的实现。您还需要更改访问方式data。它是一个vectorRecord而不是一个Record。就像是:

template<class T>
class Counter
{
    struct Record{   T itemtype;    int total;      };
    vector< Record > data;
   public:
      int increment(const T& item);
      int count(const T& item);
      void printSummary();
};
template<class T>
int Counter <T> :: increment(const T& item)
{
   auto i=data.begin();
   i= find(i,data.end(),[&item](const Record& r)
                        {return item==r.itemtype;});
   if (i!=data.end())
       return ++(i->total);
   data.push_back({item, 1}); 
   return 1; 
 }

如果你不喜欢 lambda 的乐趣:

template<class T>
int Counter <T> :: increment(const T& item)
{
    for(int i=0; i < data.size(); ++i)
      if(data[i].itemtype == item)
         return ++(data[i].total);
    data.push_back({item, 1}); 
    return 1;
}

但我认为你真正需要的是一个multiset(如果你不关心订单)。像这样的东西:

template<class T>
class Counter
{
    std::multiset <T> data;
   public:
      int increment(T item);
      int count(T item);
      void printSummary();
};

template<class T>
int Counter <T> :: increment(T item)
{
   data.insert(item);
   return data.count(item);
}
于 2013-04-11T13:10:57.817 回答
0

排队for(int i=0; i < data.size(itemtype); i++){

将会:for(int i=0; i < data.size(); i++){

并且data.push_back(itemtype = item, total = 1);可以是:

  1. data.push_back({item, 1}); // by using initializer list ; C++11

  2. 或者,

    Record r; 
    r.itemtype = item; 
    r.total = 1;
    data.push_back(r);
    

您可以查看:http ://www.cplusplus.com/reference/vector/vector/ 以了解 std::vector。

于 2013-04-11T14:39:27.947 回答