【问题标题】:How do I access member function using constant vector?如何使用常量向量访问成员函数?
【发布时间】:2017-06-28 17:59:04
【问题描述】:

我正在制作一个程序,其中我将类对象存储在一个向量中,并将这个向量作为 const 向量作为参考变量传递给一个友元函数,并使用 const_vector 对其进行迭代,我正在尝试调用类对象的成员函数使用 const_iterator 所以,我收到错误。但是当我在没有 const vector 的情况下执行此操作并在没有 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 到 vector 时它会起作用。

vector::iterator searchAccount(const vector& v,long int accno)

【问题讨论】:

  • 成员函数是否标记为const
  • 请提供代码示例(不是代码描述),并复制粘贴错误消息(它应该解释您的代码的问题)。
  • 正如其他人所说,除非您向我们提供您的代码,否则我们无法为您提供帮助。请编辑您的帖子以包含您的代码,我们将从那里开始。
  • vector::iterator searchAccount(const vector& v,long int accno) { vector::const_iterator itr; for(itr = v.begin();itr!=v.end();itr++) { if(itr->getAccNo() == accno)return itr; } 返回 v.end(); }
  • 请放在原帖中。粘贴,全选,然后按 Ctrl + K 格式化。

标签: c++ vector stl


【解决方案1】:

问题一:

为了在常量对象上调用方法,方法必须声明const(声明隐藏的this参数为const)并且不得尝试修改对象(因为thisconst)。仅仅不修改方法内的对象是不够的。所以

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&lt;AccountHolder&gt;::iterator,但在您正在使用的方法中并试图返回vector&lt;AccountHolder&gt;::const_iterator。这些是不同且不兼容的类型,因此必须更改其中之一。我推荐

vector<AccountHolder>::const_iterator searchAccount(const vector<AccountHolder>& v,long int accno)

因为const_iterator 是不可避免的const vector

【讨论】:

  • 我可以将“long int getAccNo() const”(如您在方法 1 中解释的那样)与非常量对象一起使用吗?还有一个疑问,我可以将“long int getAccNo() const”声明为“ const long int getAccNo()".
猜你喜欢
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 2013-10-13
  • 1970-01-01
  • 1970-01-01
  • 2015-12-06
  • 2012-12-13
相关资源
最近更新 更多