访问模板中的变量,该模板是具有多个变量的自定义数据类型的向量

时间:2013-04-11 12:47:53

标签: c++ function templates vector stl

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

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

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

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

Counter2.h:36:39:错误:此范围内未声明'total'

我必须能够使用命令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;
}

3 个答案:

答案 0 :(得分:0)

我不太确定我明白你在这里所做的事情,虽然一开始你正试图访问类Record的私人成员。您可以记录结构(默认情况下为public),或者提供getter / setter或者添加:

friend class Counter;

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

答案 1 :(得分:0)

您可以在Record内设置Counter私人结构。这不会暴露它的实现。您还需要更改访问data的方式。它是vector Record,而不是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);
}

答案 2 :(得分: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);
    
  3. 您可以查看:http://www.cplusplus.com/reference/vector/vector/ 了解std :: vector。