我目前正在尝试实现一个界面来创建排序算法的实例。
我有以下课程:
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的非继承。
但我确定,我的意图应该是可能的,所以我需要你的帮助指出我在这里失踪的东西。
祝你好运
答案 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;
}