模板的继承参数设置

时间:2020-05-18 03:28:45

标签: c++

因此,我尝试在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!

}

1 个答案:

答案 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;

}

请注意,仍有很大的改进空间。例如,您应在添加前检查是否存在具有特定编号的帐户。如果您不想进一步从CheckingaccountSavingaccount派生,则可以将它们标记为final,等等。