我在c ++中有四个文件
BankAccount.h
BankDatabase.h
Main.cpp
BankAccount.h
#include <string>
class BankAccount
{
public:
BankAccount(int accNumber,const std::string& accName);
void setAccNumber(const int accNumber);
int getAccNumber() const;
void setAccName(const std::string& clientName);
std::string getAccName() const ;
protected:
int mAccNumber;
std::string mAccName;
};
BankAccount::BankAccount(const int accNumber,
const std::string& accName):mAccNumber(accNumber),mAccName(accName){}
void BankAccount::setAccNumber(const int accNumber)
{
mAccNumber = accNumber;
}
void BankAccount::setAccName(const std::string& accName)
{
mAccName = accName;
}
int BankAccount::getAccNumber() const
{
return mAccNumber;
}
std::string BankAccount::getAccName() const {
return mAccName;
}
BankDatabase.h
#include <map>
#include <iostream>
#include <stdexcept>
#include "BankAccount.h"
class BankDatabase
{
public:
BankDatabase();
void addAccount(const BankAccount& acc);
void deleteAccount(int accNumber);
BankAccount& findAccount(int accNumber)
throw (std::out_of_range);
BankAccount& findAccount(std::string& accName)
throw (std::out_of_range);
void mergeDatabase(BankDatabase& db);
protected:
std::map<int,BankAccount> mAccounts;
};
BankDatabase::BankDatabase(){}
void BankDatabase::addAccount(const BankAccount& acc)
{
std::pair<std::map<int,BankAccount>::iterator,bool> res =
mAccounts.insert(std::make_pair(acc.getAccNumber(),acc));
if(!res.second)
std::cout << "Account cannot be added ";
}
void BankDatabase::deleteAccount(int accNumber)
{
if( mAccounts.count(accNumber))
mAccounts.erase(accNumber);
}
BankAccount& BankDatabase::findAccount(int accNumber)
throw(std::out_of_range)
{
auto iter = mAccounts.find(accNumber);
if(iter != mAccounts.end())
return iter->second;
throw std::out_of_range("No account number with this name ");
}
BankAccount& BankDatabase::findAccount(std::string& accName)
throw(std::out_of_range)
{
for(auto& p : mAccounts) {
if ( p.second.getAccName() == accName )
return p.second;
}
throw std::out_of_range(" No account with this name ");
}
Main.cpp的
#include <iostream>
#include "BankDatabase.h"
int main()
{
BankDatabase db;
db.addAccount(BankAccount(1,"james"));
db.addAccount(BankAccount(2,"johnson"));
db.addAccount(BankAccount(3,"kamal"));
db.addAccount(BankAccount(4,"appu"));
// find account name based on account number
std::cout << db.findAccount(1).getAccName();
// find account number based on account name
std::cout << db.findAccount("james");
// delete an account
db.deleteAccount(db.findAccount("james").getAccNumber());
// find the account
std::cout << db.findAccount("james");
//Merge database
db.mergeDatabase(db);
return 0;
}
在声明std::cout << db.findAccount("james");
我收到了一个错误:
错误:从'const char *'无效转换为'int'
但我在findAccount(int)
findAccount(string)
和BankDatabase.h
有人可以帮忙解决这个问题吗?
答案 0 :(得分:1)
而不是
BankAccount& findAccount(std::string& accName)
使用
BankAccount& findAccount(std::string const& accName)
当使用"james"
调用该函数时,该函数无法转换为std::string&
,但可以转换为临时std::string
,可以在参数时用作参数类型为std::string const&
。
另外,
std::cout << db.findAccount(std::string("james"));
是一个问题,因为operator<<()
和std::ostream
之间没有定义BankAccount
。
答案 1 :(得分:1)
您为findAccount定义了两个重载,一个采用int,另一个采用std :: string引用。 你试图用它调用的参数不是std :: string,而是一个c-string,它是一个const char *。编译器现在有两个选项:
为了调用int版本,需要从const char *到int的转换(这是你看到的错误)。
为了调用字符串版本,必须创建临时的std :: string。在此之后,必须形成对临时的非const引用(这是不允许的,并且您在问题中看不到或未显示的错误)。
由于您似乎没有更改字符串,因此对此问题的一个简单修复就是采用const std :: string&amp;代替。您的代码也存在其他一些问题。