定义类模板时调用未知方法(策略模式)

关于类模板,没有仔细学过,一直都是将就着用,今天学习策略模式时,遇到了一个问题,体现出本人在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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值