-1

itemtype変数や関数total内にアクセスするにはどうすればよいですか? increment以下のコードでは、次のようなエラーが発生します

Counter2.h: メンバー関数 'int Counter::increment(T)':

Counter2.h:28:31: エラー: 'itemtype' はこのスコープで宣言されていません

Counter2.h:36:22: エラー: 'itemtype' はこのスコープで宣言されていません

Counter2.h:36:39: エラー: 'total' はこのスコープで宣言されていません

TがCounter<T> counter;文字列や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 のプライベート メンバーにアクセスしようとしています。record を構造体 (デフォルトではパブリック) にするか、getter/setter を提供するか、代わりに以下を追加できます。

friend class Counter;

Counter がそのプライベート メンバーにアクセスできるように記録します。

于 2013-04-11T12:57:55.840 に答える
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);
    

std::vector については、http : //www.cplusplus.com/reference/vector/vector/ を参照してください。

于 2013-04-11T14:39:27.947 に答える
0

Record内部にプライベートな構造体を作ることができますCounter。それは実装を公開しません。アクセス方法も変更する必要がありますdata。ではなく、のvectorです。何かのようなもの:RecordRecord

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

ラムダの楽しみが気に入らない場合:

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 に答える