关于类模板,没有仔细学过,一直都是将就着用,今天学习策略模式时,遇到了一个问题,体现出本人在C++类的基本使用上还有很大空间。
关于问题:1,在定义一个模板类时,调用了一个未知的方法;因为知道这个方法在另外一个接口类的子类中实现,所以想直接写进类模板中,
2,如下程序context.h中的第一种定义成T类型指针的,且operateidea()未知的情况下的情况:
private:
T* p_Idea;
public:
.....
};
template<class T>
Context<T>::Context(){
p_Idea = new T;
}
template<class T>
Context<T>::~Context(){
delete p_Idea;
}
template<class T>
void Context<T>::Operate()
{
p_Idea->Operateidea();
}
3,不定义指针直接是T类型实例的
private:
T p_Idea;
public:
...........
};
template<class T>
Context<T>::Context(){}
template<class T>
Context<T>::~Context(){}
template<class T>
void Context<T>::Operate()
{
p_Idea.Operateidea();
}
上面这两种情况真的是不是太清楚,只明白一点,慢慢更新吧,等以后真懂了再更新文章
具体情况如下:
接口类strategy.h
//strategy.h
#ifndef _STRATEGY_H_
#define _STRATEGY_H_
class Strategy{
public:
Strategy(){}
virtual ~Strategy(){}
virtual void Operateidea() = 0;
};
#endif
接口类的实现:idea1.h;还可以有更多的实现idea2.h等等
//idea1.h
#ifndef _IDEA1_H_
#define _IDEA1_H_
#include"strategy.h"
#include<iostream>
using namespace std;
class Idea1 :public Strategy{
public:
Idea1(){}
~Idea1(){}
void Operateidea()
{
cout << "idea1" << endl;
}
};
#endif
第一种方案:类模板,中间使用指针的
根据策略模式的方法,定义如下类模板//context.h
#ifndef _CONTEXT_H_
#define _CONTEXT_H_
template<class T>
class Context{
private:
T* p_Idea;
public:
Context();
~Context();
void Operate();
};
template<class T>
Context<T>::Context(){
p_Idea = new T;
}
template<class T>
Context<T>::~Context(){
delete p_Idea;
}
template<class T>
void Context<T>::Operate()
{
p_Idea->Operateidea();
}
#endif
问题就发生在上面context.h中,上面的方法是正确的
第二种方案:类模板,中间不使用指针的
//context.h
#ifndef _CONTEXT_H_
#define _CONTEXT_H_
template<class T>
class Context{
private:
T p_Idea;
public:
Context();
~Context();
void Operate();
};
template<class T>
Context<T>::Context(){}
template<class T>
Context<T>::~Context(){}
template<class T>
void Context<T>::Operate()
{
p_Idea.Operateidea();
}
#endif
主函数main.cpp
//mian.cpp
#include"context.h"
#include"idea1.h"
#include"strategy.h"
void main()
{
Context<Idea1> text;
text.Operate();
}
第三种方案:不用类模板
//context.h
#ifndef _CONTEXT_H_
#define _CONTEXT_H_
#include"strategy.h"
class Context{
private:
Strategy* p_Idea;
public:
Context(Strategy* p){
p_Idea = p;
}
~Context(){
delete p_Idea;
}
void Operate(){
p_Idea->Operateidea();
}
};
#endif
主函数mian.cpp
//mian.cpp
#include"context.h"
#include"idea1.h"
#include"strategy.h"
void main()
{
Context* ptext = new Context(new Idea1);
ptext->Operate();
delete ptext;
}