与异常处理程序中的操作员<<不匹配

No match for operator << in exception handling program

本文关键字:lt 不匹配 操作员 异常处理程序      更新时间:2023-10-16
#include <iostream>
#include <string>
#include "NegativeBalanceException.hpp"
#include <memory>
class Account
{
private:
std::string name;
double balance;
public:
Account(std::string name, double balance);
~Account() {std::cout <<"Calling Account Destroyer" << std::endl;}
void get_name() const {std::cout << name << std::endl;}
void get_balance() const {std::cout << balance << std::endl;}
friend std::ostream &operator<<(std::ostream &os, const Account &account);
};
Account::Account(std::string name, double balance) 
: name{name}, balance{balance} {
if (balance < 0)
throw NegativeBalanceException();
}
std::ostream &operator<<(std::ostream &os, const Account &account) {
os << "Account Name: " << account.get_name() << "n" << "Account 
Balance: " << account.get_balance() << std::endl;
return os;
}
int main () {
std::unique_ptr<Account> Austin;
try {
Austin = std::make_unique<Account>("Austin",1000);
std::cout << *Austin << std::endl;
}
catch (const NegativeBalanceException &ex) {
std::cerr << ex.what() << std::endl;
}
};

您好,我是一名初学者程序员,我正在练习异常处理,我不知道为什么我的重载运算符<<不起作用。它不会让我显示我想要的数据。

您的get_name()get_balance()方法都是用void返回值声明的,因此重载operator<<无法将它们传递给os << ...。 在内部,这些方法正在执行自己的日志记录以std::cout,因此您需要相应地更改operator<<,例如:

std::ostream &operator<<(std::ostream &os, const Account &account) {
os << "Account Name: ";
account.get_name();
os << "Account Balance: ";
account.get_balance();
return os;
}

但是,如果os不引用std::cout,例如,如果您的main()决定将Account流式传输到std::ofstream,这将无法按预期工作。

更好的选择是更改get_name()get_balance()以返回值,而不是直接执行自己的日志记录:

std::string get_name() const { return name; }
double get_balance() const { return balance; }

然后,重载operator<<将按预期工作。

这些

void get_name() const {std::cout << name << std::endl;}
void get_balance() const {std::cout << balance << std::endl;}

应该这样写

std::string get_name() const { return name; }
double get_balance() const { return balance; }

返回值的函数与打印值的函数不同。在重载运算符中<<需要两个函数来返回account 对象中的值,以便运算符<<可以打印它们。