通过构造函数param实例化子类

时间:2015-04-13 07:31:40

标签: c++ inheritance constructor

我目前正在尝试实现一个界面来创建排序算法的实例。

我有以下课程:
ISortAlgorithm - >摘要(界面“类”) AlgorithmModule - >具有静态功能 - >

static ISortAlgorithm* CreateSortInstanceOf(EAlgorithm AlgorithmEnum)

具有ISortAlgorithm子类的类容器(名称空间算法),如 - >

class SelectionSort : public ISortAlgorithm

还存在每个实现的算法的枚举 - >

enum EAlgorithm {SELECTIONSORT, BUBBLESORT, ...}

在运行期间,有人想要使用我模块中的算法,他会调用:

AlgorithmModule::CreateSortInstanceOf(/*enum of desired algorithm */)

我在该功能中做的第一件事是 - >

{
switch (enumparam)
{
case (EAlgorithm::INSERTSORT) :
        return SortAlgorithm = new Algorithms::InsertSort();
        break;
case (blah): [..]
}

这已经有效了。但现在我想到了一种方法,使我更容易,我想出了我可以使用构造函数,并尝试:

class InsertSort : public ISortAlgorithm
{
public:
    InsertSort() : ISortAlgorithm(EAlgorithm::INSERTSORT){}
}

class SelectionSort : public ISortAlgorithm
{
public:
    SelectionSort() : ISortAlgorithm(EAlgorithm::SELECTIONSORT) {}
}

除此之外,我将 CreateSortInstanceOf 修改为:

static ISortAlgorithm* CreateSortInstanceOf(EAlgorithm AlgorithmEnum)
{
    ISortAlgorithm* SortAlgorithm = new ISortAlgorithm(AlgorithmEnum);  
    return SortAlgorithm;
}

所以意图是,使用构造函数param来调用正确的子类。意味着我不必为将来要实现的任何算法更改此函数的代码。然而,当然编译器抱怨,我无法实例化一个抽象类,我认为另一个问题是ctor的非继承。

但我确定,我的意图应该是可能的,所以我需要你的帮助指出我在这里失踪的东西。

祝你好运

1 个答案:

答案 0 :(得分:0)

这是一种做你想做的事情,即使它不一定是最好的:



    #include "stdafx.h"
    #include "map"

    enum EAlgorithm { SELECTIONSORT=0, INSERTSORT=1 };

    class ISortAlgorithm;
    typedef ISortAlgorithm * (*fct)(void);
    std::map mapCreator;

    class ISortAlgorithm
    {
        public:
        ISortAlgorithm(void) {};
        virtual void run(void) = 0;
        static ISortAlgorithm* CreateSortInstanceOf(EAlgorithm AlgorithmEnum)
        {
            std::map::iterator it = mapCreator.find(AlgorithmEnum);
            if (it == mapCreator.end())
                return NULL;
            return it->second();
        }
    };

    class InsertSort : public ISortAlgorithm
    {
        public:
        InsertSort(){}
        virtual void run(void){};
        static ISortAlgorithm * Create(void)
        {
            return (ISortAlgorithm*) new InsertSort();
        };
    };

    class SelectionSort : public ISortAlgorithm
    {
        public:
        SelectionSort(){};
        virtual void run(void){};
        static ISortAlgorithm * Create(void)
        {
            return (ISortAlgorithm*) new SelectionSort();
        };
    };

    int _tmain(int argc, _TCHAR* argv[])
    {
        mapCreator.insert(std::pair(EAlgorithm::INSERTSORT, InsertSort::Create));
        mapCreator.insert(std::pair(EAlgorithm::SELECTIONSORT, SelectionSort::Create));
        ISortAlgorithm * pt1 = ISortAlgorithm::CreateSortInstanceOf(EAlgorithm::INSERTSORT);
        ISortAlgorithm * pt2 = ISortAlgorithm::CreateSortInstanceOf(EAlgorithm::SELECTIONSORT);
        return 0;
    }