======
Logging
I would set up logging so that each action does its own logging. To do this it needs a logging object that knows what to do with the message. If you define your logging object as a class you can define different styles of logging.
class SimpleMessageLogger
{
public:
virtual ~SimpleMessageLogger() {}
virtual void log(std::string const& message) = 0;
};
class SimpleMessageLoggerTOStdErr: public SimpleMessageLogger
{
public:
virtual void log(std::string const& message) override
{
std::cerr << time(nullptr) << ": " << message << "\n";
}
}
class SimpleMessageLoggerTOSystem: public SimpleMessageLogger
{
public:
virtual void log(std::string const& message) override
{
// Call system logger
}
}
Then your account needs to be set up to use a logger:
class Account
{
SimpleMessageLogger& logger;
int balance;
public:
Account(SimpleMessageLogger& logger)
: logger(logger)
, balance(0)
{}
void withdraw(int amount) {
if (balance < amount) {
logger.log("OverDrawn. We make money by charging fees");
}
balance -= amount;
std::stringstream message;
message << "Withdrawal: From account 1123 Amount: " << amount << " New Balance: " << balance;
logger.log(message.str());
}
}
int main()
{
std::unique_ptr<SimpleMessageLogger> logger;
// Decide what type of logger you want.
logger = new SimpleMessageLoggerTOStdErr;
Account. myAccount(*logger);
myAccount.withdraw(1'000'000);
}