在类中定义成员,但直到运行时才知道实际类型

时间:2011-11-24 11:47:32

标签: c++ inheritance polymorphism

这可能是普通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 /整个代码中的其他内容?

我很高兴只能参考我应该使用的继承/多态(?)的哪个方面,并且可以将其余部分google。

谢谢你们。

皮特

3 个答案:

答案 0 :(得分:6)

您可以将factory pattern与C ++的多态性结合起来。

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 :(得分: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的回答几乎相同)。

答案 2 :(得分:1)

有一个抽象的超类EcgFormat(有几个virtual方法保持抽象=0)和几个子类ECGRecordingDefaultFormatECGRecordingEDFFormat