注册 登录
编程论坛 C++教室

问题求教!

lzyren2008 发布于 2008-03-28 09:34, 515 次点击
#include <string>
#include <iostream>
using namespace std;
class PurchaseRequest {
public:
    double Amount;       // 一个采购的金额
    int Number;              // 采购单编号
    string Purpose;        // 采购目的
};
class Approver {              // 审批者类
public:
    Approver(){    successor = NULL;    }
    virtual void ProcessRequest(PurchaseRequest aRequest)
    {
        if (successor != NULL){  successor->ProcessRequest(aRequest);    }
    }
    void SetSuccessor(Approver *aSuccesssor){ successor = aSuccesssor; }
private:
      Approver* successor;
};
class Congress : public Approver {
public:
    void ProcessRequest(PurchaseRequest aRequest){
        if(aRequest.Amount >= 500000){    /* 决定是否审批的代码省略 */    }
        else   Approver::ProcessRequest(aRequest);
    }
};
class Director : public Approver {
public:
    void ProcessRequest(PurchaseRequest aRequest){  /* 此处代码省略 */    }
};
class President : public Approver {
public:
    void ProcessRequest(PurchaseRequest aRequest){  /* 此处代码省略 */  }
};
class VicePresident : public Approver {
public:
    void ProcessRequest(PurchaseRequest aRequest){  /* 此处代码省略 */   }
};
void main(){
    Congress Meeting;  
    VicePresident VPre;  
    Director Dir;  
    President Pre;      
    // 构造责任链
    Meeting.SetSuccessor(NULL);        
    VPre.SetSuccessor(&Pre);
    Pre.SetSuccessor(&Meeting);
    Dir.SetSuccessor(&VPre);
    
    PurchaseRequest aRequest;     // 构造一采购审批请求
    cin >> aRequest.Amount;   // 输入采购请求的金额
    
    Dir.ProcessRequest(aRequest);     // 开始审批
    return ;
}
07年下半年软设最后一题,这个搞不懂了,不知怎么传来传去的,希望那位高手能解答一下,万分感激了!
3 回复
#2
中学者2008-03-28 09:38
问题是什么?? 什么是传来传去~
#3
sunkaidong2008-03-28 10:09
我也参加了去年的考试..建议lz多看看书..这是一个审批过程...每个审批这都设立继任者,继任者的顺序我忘了,以钱的多少作为条件,如果满足就进行处理,不满足就给继任者....里面用到了基类指针指向派生类....同时由于每个函数都是基类虚函数重构...实现动态编连通过基类指针访问派生类函数....

[[it] 本帖最后由 sunkaidong 于 2008-3-28 10:30 编辑 [/it]]
#4
sunkaidong2008-03-28 10:48
#include <string>
#include <iostream>
using namespace std;
class PurchaseRequest {
public:
    double Amount;       // 一个采购的金额
    int Number;              // 采购单编号
    string Purpose;        // 采购目的
};
class Approver {              // 审批者类
public:
    Approver(){    successor = NULL;    }
    virtual void ProcessRequest(PurchaseRequest aRequest)
    {
        if (successor != NULL){  successor->ProcessRequest(aRequest);    }
    }
    void SetSuccessor(Approver *aSuccesssor){ successor = aSuccesssor; }
private:
      Approver* successor;
};
class Congress : public Approver {
public:
    void ProcessRequest(PurchaseRequest aRequest){
        if(aRequest.Amount >= 500000)
        {
            cout<<"议案由议会说了算"<<endl;
        }
        else   Approver::ProcessRequest(aRequest);
    }
};
class Director : public Approver {
public:
    void ProcessRequest(PurchaseRequest aRequest)
    {   if(aRequest.Amount <10000)
        {
        cout<<"议案由主任说了算"<<endl;
        }
        else
            Approver::ProcessRequest(aRequest);
    }
};
class President : public Approver
{
public:
    void ProcessRequest(PurchaseRequest aRequest)
    {
        if(aRequest.Amount <500000)
        {
        cout<<"议案由董事长说了算"<<endl;
        }
        else
            Approver::ProcessRequest(aRequest);
        }
    };

class VicePresident : public Approver
{
public:
    void ProcessRequest(PurchaseRequest aRequest)
    {  if(aRequest.Amount <100000)
        {
        cout<<"议案由副董事长说了算"<<endl;
        }
        else
            Approver::ProcessRequest(aRequest);
        }   
};
void main(){
    Congress Meeting;  
    VicePresident VPre;  
    Director Dir;  
    President Pre;
    

    Meeting.SetSuccessor(NULL);        
    VPre.SetSuccessor(&Pre);
    Pre.SetSuccessor(&Meeting);
    Dir.SetSuccessor(&VPre);
   
    PurchaseRequest aRequest;     // 构造一采购审批请求
    cin >> aRequest.Amount;   // 输入采购请求的金额
   
    Dir.ProcessRequest(aRequest);     // 开始审批
    return ;
}
1