如何使用常数向量访问成员函数
How do I access member function using constant vector?
我正在制作一个程序,其中我将class对象存储在向量中,并将该向量传递给朋友函数作为const vector作为参考变量,并使用const_vector进行迭代,我正在尝试要使用const_iterator调用类对象的成员函数,所以我会遇到错误。但是当我这样做的情况下执行此操作并在没有const_iterator的情况下进行迭代时,我的程序将成功运行。我们无法迭代const_vector,或者我们无法访问成员使用const_vector的变量或函数。
vector<AccountHolder>::iterator searchAccount(const vector<AccountHolder>& v,long int accno)
{
vector<AccountHolder>::const_iterator itr;
for(itr = v.begin();itr!=v.end();itr++)
{
if(itr->getAccNo() == accno)return itr;
}
return v.end();
}
这是整个代码。
#include<iostream>
#include<vector>
using namespace std;
class Account{
private:
long int AccNo;
char AccType;
public:
long int getAccNo()
{
return AccNo;
}
char getAccType()
{
return AccType;
}
void setAccNo(long int accno)
{
AccNo = accno;
}
void setAccType(char acctype)
{
AccType = acctype;
}
};
class AccountHolder:public Account{
private:
string Name;
public:
string getAccHolderName()
{
return Name;
}
void setAccHolderInfo(long int accno,char acctype,string name)
{
setAccNo(accno);
setAccType(acctype);
Name = name;
}
void displayAccountHolderInfo()
{
cout << "Name : " << getAccHolderName() << endl;
cout << "Account Number : " << getAccNo() << endl;
cout << "Account Type : " << getAccType() << endl;
}
friend void displayAllAccountHolder(vector<AccountHolder> &v);
friend vector<AccountHolder>::iterator searchAccount(vector<AccountHolder> &v,long int accno);
//friend bool searchAccount(const vector<AccountHolder> &v,long int accno,char acctype);
//friend vector<AccountHolder>::iterator searchAccount(const vector<AccountHolder> &v,long int accno=0,string name);
};
void displayAllAccountHolder(vector<AccountHolder> &v)
{
for(vector<AccountHolder>::iterator itr = v.begin();itr != v.end() ; itr++)
itr->displayAccountHolderInfo();
}
vector<AccountHolder>::iterator searchAccount(const vector<AccountHolder>& v,long int accno)
{
vector<AccountHolder>::const_iterator itr;
for(itr = v.begin();itr!=v.end();itr++)
{
if(itr->getAccNo() == accno)return itr;
}
return v.end();
}
int main()
{
vector<AccountHolder> Acc;
vector<AccountHolder> SavingAcc;
vector<AccountHolder> CurrentAcc;
vector<AccountHolder>::iterator temp;
AccountHolder AccH;
long int accno;
char acctype;
string name;
do{
cout << "Select Your Choice : " << endl;
cout << "1. Insert Data " << endl;
cout << "2. Display Data " << endl;
cout << "3. Display All User Data " << endl;
cout << "4. Exit " << endl;
cout << " Enter Your Choice : ";
int choice;
cin >> choice;
switch(choice)
{
case 1: cout << "nEnter Name : ";
cin.get();
getline(cin >> ws,name);
accNo:
cout << "nEnter Account Number : ";
cin >> accno;
if(searchAccount(Acc,accno)!=Acc.end())
{
cout << "nAccount Number already exist." << endl;
goto accNo;
}
accType:
cout << "nEnter Account Type : ";
cin >> acctype;
if(acctype == 's' || acctype =='S')
{
AccH.setAccHolderInfo(accno,'S',name);
SavingAcc.push_back(AccH);
Acc.push_back(AccH);
}
else if(acctype == 'c' || acctype == 'C')
{
AccH.setAccHolderInfo(accno,'C',name);
CurrentAcc.push_back(AccH);
Acc.push_back(AccH);
}
else
{
cout << "n Invalid Account Type" << endl;
goto accType;
}
break;
case 2: cout << "nEnter Account Number : ";
cin >> accno;
cout << "nEnter Account Type(or just type 'n') : ";
cin.get();
cin >> acctype;
if(acctype == 's' || acctype == 'S')
temp = searchAccount(SavingAcc,accno);
else if(acctype == 'c' || acctype == 'C')
temp = searchAccount(CurrentAcc,accno);
else
temp = searchAccount(Acc,accno);
if(temp!=SavingAcc.end() && temp!=CurrentAcc.end() && temp!=Acc.end() )
temp->displayAccountHolderInfo();
else
cout << "n Account does not exist. " << endl;
break;
case 3:displayAllAccountHolder(Acc);
break;
case 4: return 0;
break;
default:
break;
}
}while(true);
return 0;
}
但是,当您将const向量删除到向量时,它将起作用。
vector :: iterator searchaccount(const vector&amp; v,long int accno(
问题1:
为了在常数对象上调用方法,必须声明该方法const
(声明隐藏的this
参数为const
(,并且不得尝试修改对象(因为this
是const
(。根本不修改方法中的对象不够好。所以
long int getAccNo()
{
return AccNo;
}
必须是
long int getAccNo() const
{
return AccNo;
}
实际上,每当您拥有一个不或不应该修改对象的函数时,都应从一般原理中声明const
。这使编译器更容易为您捕获错误,并可以节省很多调试时间。
问题2:
vector<AccountHolder>::iterator searchAccount(const vector<AccountHolder>& v,long int accno)
返回 vector<AccountHolder>::iterator
,但是在您使用的方法内,并尝试返回vector<AccountHolder>::const_iterator
。这些是不同的,不兼容的类型,因此必须更改其中之一。我建议
vector<AccountHolder>::const_iterator searchAccount(const vector<AccountHolder>& v,long int accno)
因为const_iterator
与const vector
不可避免。
相关文章:
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 将公共但非静态的成员函数与ALGLIB集成
- 使用指向成员的指针将成员函数作为参数传递
- 将重载的成员函数传递给函数模板
- 我不小心调用了一个没有自己类对象的成员函数.但这是怎么回事呢
- 如何在C++中使用非静态成员函数作为回调函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 关联容器的下界复杂性:成员函数与非成员函数
- 在 C++ 中用派生类型重写成员函数
- 链表的泛型函数remove()与成员函数remove)
- 如何将lambda作为模板类的成员函数参数
- constexpr构造函数需要常量成员函数时出现问题
- 将自由函数绑定为类成员函数
- 区分非成员函数和头文件中的成员函数
- 如何从子成员函数修改父公共成员变量
- 保留对其他类的成员函数的引用
- 在运算符重载定义中使用成员函数(const错误)
- 内联如何影响模块接口中的成员函数
- 将成员函数指针作为参数传递给模板方法