带有模板的C ++策略模式

时间:2012-06-25 14:39:10

标签: c++ templates strategy-pattern

这是C ++中策略模式的示例实现:

ConcreteStrategy.h

class ConcreteStrategy {
public:
    ConcreteStrategy();
    ~ConcreteStrategy();
    const OtherObject* doSomething(const OtherObject &obj);
};

ConcreteStrategy.cpp

#include "ConcreteStrategy.h"

ConcreteStrategy::ConcreteStrategy() { // etc. }
ConcreteStrategy::~ConcreteStrategy() { // etc. }
const OtherObject* ConcreteStrategy::doSomething(const OtherObject &obj) { // etc. }

MyContext.h

template <class Strategy> class MyContext {
    public:
        MyContext();
        ~MyContext();
        const OtherObject* doAlgorithm(const OtherObject &obj);
    private:
        Strategy* _the_strategy;
};

MyContext.cpp

#include "MyContext.h"

template <typename Strategy>
MyContext<Strategy>::MyContext() {
    _the_strategy = new Strategy;
}

template <typename Strategy>
MyContext<Strategy>::~MyContext() {
    delete _the_strategy;
}

template <typename Strategy>
const OtherObject* MyContext<Strategy>::doAlgorithm(const OtherObject &obj) {
    obj = _the_strategy(obj);
    // do other.
    return obj;
}

的main.cpp

#include "MyContext.h"
#include "ConcreteStrategy.h"
#include "OtherPrivateLib.h"

int main(int argc,char **argv) {
    OtherObject* obj = new OtherObject;
    MyContext<ConcreteStrategy>* aContext = new MyContext<ConcreteStrategy>;
    obj = aContext.doAlgorithm(obj);

    // etc.

   delete aContext;
   delete obj;

   return 0;
}

这种实施是否合适?这是我在C ++中使用模板的第一种方法,我有点怀疑,特别是在上下文(MyContext)中构建和销毁模板对象(策略)。

更新: 我在编译时遇到了这个错误:

undefined reference to `MyContext<Strategy>::MyContext()'

2 个答案:

答案 0 :(得分:5)

首先,类模板实现应该放在头文件中或头文件所包含的文件中,而不是要编译的.cpp文件中。编译器需要查看模板代码才能创建MyContext<ConcreteStrategy>所需的main。这是编译器错误的原因。

其次,与模板无关,你有很多动态分配对象的用法,没有明显的原因。我会更改doSomethingdoAlgorithm以按值返回,例如

OtherObject doSomething(const OtherObject &obj);

并从主要内容中移除new的所有用途,例如:

int main(int argc,char **argv) {
    OtherObject obj;
    MyContext<ConcreteStrategy> aContext;
    obj = aContext.doAlgorithm(obj);
    return 0;
}

如果你真的必须使用动态分配的对象,那么我建议使用smart pointers,特别是C ++ 11的std::unique_ptr

答案 1 :(得分:0)

将算法封装在类层次结构中,让该算法的客户端拥有指向该层次结构的基类的指针,并将所有算法请求委托给该“匿名”包含的对象,称为strategy pattern < / p>