如何访问itemtype
函数中的变量total
和increment
?我下面的代码给出了如下错误
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;
}
答案 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);
可以是:
data.push_back({item, 1}); // by using initializer list ; C++11
或,
Record r;
r.itemtype = item;
r.total = 1;
data.push_back(r);
您可以查看:http://www.cplusplus.com/reference/vector/vector/ 了解std :: vector。