C ++类继承,构造函数应该如何?

时间:2018-05-06 12:44:19

标签: c++ class inheritance

我想编写一个代码,用于计算客户需要支付多少美元作为电话费。

我想有3种类型的合同:

基本:10美元/分钟,5美元/短信

SMSGod:10美元/分钟,1美元/短信和首150封免费短信

升级:5美元/分钟,3美元/短信和前25条免费短信

我想建立这样的东西:

包含客户必须为打电话和短信支付的价格的课程:

my_str.encode('utf-16').decode('unicode_escape')
'ÿþ\\\x00x\x00a\x005\x00\\\x00x\x00c\x000\x00\\\x00x\x00e\x006\x00a\x00K\x00\\\x00x\x00f\x009\x00\\\x00x\x008\x000\x00\\\x00x\x00b\x001\x00\\\x00x\x00c\x008\x00*\x00\x01\x00\x12\x00$\x00\\\x00x\x00f\x00b\x00p\x00\x1e\x00(\x004\x00\\\x00x\x00d\x006\x00{\x00;\x00Z\x00\\\x00x\x00'

3个后代类你可以在上面看到什么类型的合同:

class BaseClass 
{
private: 
   int minutesPrice; 
   int SMSPrice;
public:
    setMinutesPrice(int x) { minutesPrice = x; }
    setSMSPrice(int x) { SMSPrice = x; }
};

然后是客户端类:

class Basic : public BaseClass 
{
public:
    Basic()
    {
        setMinutesPrice(10);
        setSMSPrice(5);
    }
}

class SMSGod : public BaseClass
{
private: 
   int freeSMS;
public: 
   SMSGod() 
   {
       setMinutesPrice(10);
       setSMSPrice(1);
       freeSMS = 150;
   }
}

class Upgraded: public BaseClass
{
private: 
   int freeSMS;
public: 
   Upgraded() 
   {
       setMinutesPrice(5);
       setSMSPrice(3);
       freeSMS = 25;
   }
}

这是我的问题。我应该如何构建Client()构造函数,以便能够构建一个Client first_client(...);宾语。我应该怎样调用正确的构造函数: Basic SMSGod 升级基于 typeOfContract

这应该有效:

class Client: public BaseClass
{
public:
    string name;
    string phoneNumber;
    string typeOfContract;
    int talkedMinutes;
    int sentSMS;
public:
Client(...){...}
};

然后另一个功能是根据他说话的时间(50)计算账单,他发送了多少短信(25),以及第三个参数("升级")我可以使用getter函数来了解获得"升级"的人的基本价格是多少?合同,以及他们获得了多少免费短信。

(这应该在最后计算电话帐单:

Client Jack("Jack", "444-468-745", "Upgraded", 50, 25);

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

您的客户端类可以是模板类,并且基于模板参数传递适当的构造函数将被调用:

template <class T>
class Client:public T
{
  private:
     T Obj;
  public:
     T getObject() const
     {
        return Obj;
     } 

};
Client<SMSGod> c;

template<class T>
int havetopay(Client<T> clientObj)
{
   auto x = clientObj.getObject();
   int freeSMS = x.getFreeSMS();
   int sentSMS = x.getSentSMS();
   int SMS;
   if (freeSMS > sentSMS) SMS = 0;
       else SMS = sentSMS - freeSMS;
   return (SMS * x.getSMSPrice() + x.getTalkedMinutes() * x.getMinutesPrice());
}

然后你可以将hastopay改为模板化函数

答案 1 :(得分:0)

正如我在评论中所述,我不认为Client类应该继承处理计划细节和计算的类,因为它们将它们错误地联系在一起。想要动态地改变计划并因此使客户端成为具有计划的模板类也是非常合理的,因为它的类型也不必要地将它们联系在一起(尽管它可能节省一些编码)。我建议采取以下措施:

Client Jack = new Client("Jack", "444-468-745", 50, 25);
Jack.setPlan(new Upgraded());
int JacksBill = Jack.getBill();

现在您可以先创建一个客户端,然后将其计划设置为您喜欢的任何计划(您可能希望强制使用默认计划构建它,以确保它始终具有一个并避免空检查):

{{1}}

我也不认为设置谈话时间并将构造函数中的短信发送给客户端是很有意义的,但这取决于你。