因此,我尝试在Class Bank中添加带有vector的新帐户。对于从班级bankaccount派生的新帐户,例如班级检查和班级保存。
我无法弄清楚必须在void addaccount()参数中放入哪种类型的参数,因此可以在下面的主函数中使用它。是否有可能我不必使用模板?据我了解,这是唯一的选择,因为我正在使用它来调用多个类类型。
Bank b;
b.addAccount(new CheckingAccount(12345, 18));
#include "pch.h"
#include <iostream>
#include <vector>
using namespace std;
class bankaccount {
int acctnum;
double balance;
public:
bankaccount(double newbalance=0.00, int newacctnum=0) { balance = newbalance; acctnum = newacctnum; }
int getacctnum() { return acctnum;}
double getbalance() { return balance; }
double setbalance(double newmoney) { balance += newmoney; }
void deposit(double newdepo) {
balance=getbalance() + newdepo;
}
void deposit(double newwith) {
balance = getbalance() - newwith;
}
};
class Savingaccount: public bankaccount
{
Savingaccount(int newacctnum, double rate):bankaccount(){
acctnum = newacctnum;
balance = getbalance() * (1 + rate);
};
void deposit(double newdepo) {
balance = getbalance() + newdepo;
}
void deposit(double newwith) {
balance = getbalance() - newwith;
}
};
class Checkingaccount : public bankaccount {
Checkingaccount(int newacctnum, double rate);
void deposit(double newdepo) {
balance = getbalance() + newdepo;
}
void deposit(double newwith) {
balance = getbalance() - newwith;
}
};
template <class T>
class Bank {
vector<T> x;
public:
void addaccount(T *temp);
void runmonthly();
};
int main() {
Bank b;
b.addAccount(new CheckingAccount(12345, 18)); //$18 monthly fee
b.addAccount(new SavingsAccount(12346, 0.02)); // 2% per month interest!
}
答案 0 :(得分:0)
在您的示例中,不需要模板。您可以使用运行时多态性,而您已经到了一半。但是,您的代码有很多错误,我已修复了多个错误。尽管如此,我仍然可能错过了一些东西。下次,请确保您的代码中没有与您的问题无关的错误(例如,错误的名称,在类中具有相同签名的多个函数等)。这是一个工作代码,请参见代码中的注释以获取解释(live demo):
#include <iostream>
#include <vector>
#include <string>
// We need this for std::unique_ptr
#include <memory>
using namespace std;
class bankaccount {
// To access the members from base classes, make them protected.
protected:
int acctnum;
double balance;
public:
bankaccount(double newbalance=0.00, int newacctnum=0) { balance = newbalance; acctnum = newacctnum; }
int getacctnum() { return acctnum;}
double getbalance() { return balance; }
// The return type should be void.
void setbalance(double newmoney) { balance += newmoney; }
// Make this virtual, to be able to choose the correct function from derived
// classes via runtime polymorphism.
virtual void deposit(double newdepo) {
balance=getbalance() + newdepo;
}
// Added this to demonstrate runtime polymorphism.
virtual string accounttype () const {return "base";}
// I removed the second deposit method, as you are not allowed to
// have multiple functions with the same signature. Btw both functions did
// the same.
// When having virtual functions, you should also have a virtual destructor.
virtual ~bankaccount() = default;
};
class Savingaccount: public bankaccount
{
// The functions above should be part of the public interface.
public:
Savingaccount(int newacctnum, double rate):bankaccount(){
acctnum = newacctnum;
balance = getbalance() * (1 + rate);
};
// The override keyword specifies, that a virtual function of the base
// class is going to be overwritten.
virtual void deposit(double newdepo) override {
balance = getbalance() + newdepo;
}
// Added this to demonstrate runtime polymorphism.
virtual string accounttype () const {return "saving";}
// When having virtual functions, you should also have a virtual destructor.
virtual ~Savingaccount() = default;
};
class Checkingaccount : public bankaccount
{
// The functions above should be part of the public interface.
public:
Checkingaccount(int newacctnum, double rate):bankaccount() {/*TODO*/};
// Make this function virtual:
virtual void deposit(double newdepo) override {
balance = getbalance() + newdepo;
}
// Added this to demonstrate runtime polymorphism.
virtual string accounttype () const override {return "checking";}
// When having virtual functions, you should also have a virtual destructor.
virtual ~Checkingaccount() = default;
};
class Bank {
vector<unique_ptr<bankaccount>> x;
public:
auto& getaccounts() const {return x;}
// Now, pass a pointer to the base class. The correct functions deposit
// and accounttype will be called as you marked them in the base class as
// virtual.
void addaccount(bankaccount *temp) {x.emplace_back(temp);}
void runmonthly() {/*TODO*/};
};
int main() {
Bank b;
b.addaccount(new Checkingaccount(12345, 18)); //$18 monthly fee
b.addaccount(new Savingaccount(12346, 0.02)); // 2% per month interest!
for (const auto& account : b.getaccounts())
std::cout << account->accounttype() << std::endl;
}
请注意,仍有很大的改进空间。例如,您应在添加前检查是否存在具有特定编号的帐户。如果您不想进一步从Checkingaccount
或Savingaccount
派生,则可以将它们标记为final
,等等。