2011-11-24 66 views
1

這可能是普通C++用戶的基本問題。在功能上,我有一個ECG監視器,並且想要選擇在運行時使用哪種輸出格式。我已經建立了兩個類,揭示相同的方法和成員(ECGRecordingDefaultFormat和ECGRecordingEDFFormat),例如。 - > InsertMeasure, - > setFrequency, - > setPatientName等在類中定義成員,但直到運行時才知道實際類型

我知道我可以定義每種格式類類型的一個實例,然後把在:

if (ECGFormatToUse == ECGFormat.EDF) { 
    ecgDefaultFormat.InsertMeasure(x); 
} 
if (ECGFormatToUse == ECGFormat.Default) { 
    ecgEDFFormat.InsertMeasure(x); 
} 

所有整個代碼,但我想我可能不會完全使用C++的動態類型。

問題是:我可以在main()中只定義一個變量,並且在運行時選擇我想要的格式後,讓代碼使用暴露的'InsertMeasure'方法使用正確的類,避免了很多if /其他的代碼?

我會很高興只提及繼承/多態性(?)的哪一方面,我應該使用,並可以谷歌其餘。

謝謝你們。

皮特

+0

感謝您的回答Luchian,Basile和hmjd。我從中得到的是:在基類中創建一個虛擬方法,從這個類繼承。 UPS! – Pete855217

回答

6

你可以用C++的多態性factory pattern結合起來。

class Base 
{ 
    virtual void InsertMeasure() = 0; //virtual pure, make the base class abstract 
}; 

class ECGRecordingDefaultFormat : public Base 
{ 
    virtual void InsertMeasure(); 
}; 

class ECGRecordingEDFFormat : public Base 
{ 
    virtual void InsertMeasure(); 
}; 

class Factory 
{ 
    static Base* create(ECGFormat format) 
    { 
     if (format == ECGFormat.EDF) 
     return new ECGRecordingEDFFormat; 
     if (format == ECGFormat.Default) 
     return new ECGRecordingDefaultFormat; 
     return NULL; 
    } 
}; 

int main() 
{ 
    ECGFormat format; 
    //set the format 
    Base* ECGRecordingInstance = Factory::create(format); 
    ECGRecordingInstance->InsertMeasure(); 
    return 0; 
} 
1

有一個抽象的超類EcgFormat(與幾個virtual方法保持抽象與=0)和若干子類ECGRecordingDefaultFormatECGRecordingEDFFormat

2

其他人已經回答了,但我張貼了這個,因爲我把它寫在:

class EcgFormat 
{ 
public: 
    virtual void InsertMeasure(int x) = 0; 
}; 


class EcgFormatA : public EcgFormat 
{ 
public: 
    void InsertMeasure(int x) 
    { 
     cout << "EcgFormatA: " << x << "\n"; 
    } 
}; 

class EcgFormatB : public EcgFormat 
{ 
public: 
    void InsertMeasure(int x) 
    { 
     cout << "EcgFormatB: " << x << "\n"; 
    } 
}; 

class EcgFormatFactory 
{ 
public: 
    static std::shared_ptr<EcgFormat> makeEcgFormat(char a_format) 
    { 
     switch (a_format) 
     { 
     case 'A': 
      return std::make_shared<EcgFormatA>(); 
      break; 
     case 'B': 
      return std::make_shared<EcgFormatB>(); 
      break; 
     default: 
      throw std::exception("Invalid format"); 
      break; 
     } 
    } 
}; 

int main() 
{ 
    std::shared_ptr<EcgFormat> format = EcgFormatFactory::makeEcgFormat('A'); 
    format->InsertMeasure(5); 

    return 0; 
} 

(我知道這很像@Luchian的答案)。

相關問題