C++ 指针引用转换的问题

Restart_2013 2014-05-06 11:32:10
报错:
“CContext::CContext(CStrategy *&)”: 不能将参数 1 从“CConcreteStrategyA *”转换为“CStrategy *&”

如果CContext(CStrategy *&)构造函数写成 CContext(CStrategy *)这种形式则会出现安全隐患。

所以要如何解决这个问题??

#include "stdafx.h"
#include <iostream>
using std::cout;
using std::endl;



// 抽象类 -- 无法创建对象
class CStrategy
{
public:
virtual void AlgorithmInterface() = 0;
};


//具体算法A
class CConcreteStrategyA:public CStrategy
{
public:
CConcreteStrategyA()
{ }
virtual~CConcreteStrategyA()
{

}
//算法A实现方法
public:
virtual void AlgorithmInterface()
{
cout << "算法A实现" << endl;
}
};

//具体算法B
class CConcreteStrategyB:public CStrategy
{
public:
CConcreteStrategyB()
{ }
virtual~CConcreteStrategyB()
{

}
//算法B实现方法
public:
virtual void AlgorithmInterface()
{
cout << "算法B实现" << endl;
}
};

//具体算法C
class CConcreteStrategyC:public CStrategy
{
public:
CConcreteStrategyC()
{ }
virtual~CConcreteStrategyC()
{

}
//算法C实现方法
public:
virtual void AlgorithmInterface()
{
cout << "算法C实现" << endl;
}
};

//上下文
class CContext
{
public:
// 存在安全隐患
// CContext(CStrategy *strategy)
CContext(CStrategy* &strategy)
{
m_strategy = strategy;
}
virtual~CContext()
{
if (m_strategy)
{
delete m_strategy;
m_strategy = NULL;
}
}

public:
//上下文接口
virtual void ContextInterface()
{
m_strategy->AlgorithmInterface();
}

private:
CStrategy *m_strategy;
};


int _tmain(int argc, _TCHAR* argv[])
{
CConcreteStrategyA *pTmp = NULL;
pTmp = new CConcreteStrategyA();
CContext *pContextA = new CContext(pTmp);
pContextA->ContextInterface();
delete pTmp;
delete pContextA;

// CContext *pContextB = new CContext(new CConcreteStrategyB());
// pContextB->ContextInterface();
// delete pContextB;
//
// CContext *pContextC = new CContext(new CConcreteStrategyC());
// pContextC->ContextInterface();
// delete pContextC;

return 0;
}

...全文
309 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ye667788 2014-05-07
  • 打赏
  • 举报
回复
引用 7 楼 zcdabing 的回复:
[quote=引用 6 楼 ye667788 的回复:] [quote=引用 5 楼 zcdabing 的回复:] CStrategy *& 我在想你这个想表达什么 指针还加个引用?
加上引用可以修改指针本身[/quote] 求详细点的解释[/quote]

#include "stdafx.h"
#include <iostream>
using namespace std;

int a = 3;
int b = 4;

void change1(int *&p)
{
	p = &b;
}

void change2(int *p)
{
	p = &b;
}

int _tmain(int argc, _TCHAR* argv[])
{
	int *p1 = &a;
	change1(p1);
	cout<<*p1<<endl;//输出4

	int *p2 = &a;
	change2(p2);
	cout<<*p2<<endl;//输出3

	system("pause");
	return 0;
}
zcdabing 2014-05-07
  • 打赏
  • 举报
回复
引用 6 楼 ye667788 的回复:
[quote=引用 5 楼 zcdabing 的回复:] CStrategy *& 我在想你这个想表达什么 指针还加个引用?
加上引用可以修改指针本身[/quote] 求详细点的解释
版主大哥 2014-05-06
  • 打赏
  • 举报
回复

CConcreteStrategyA *pTmp = NULL; //这里为啥不写成CStrategy* pTmp = new CConcreteStrategyA(); 呢?
pTmp = new CConcreteStrategyA();
CContext *pContextA = new CContext(pTmp);
pContextA->ContextInterface();
delete pTmp;
delete pContextA;
Restart_2013 2014-05-06
  • 打赏
  • 举报
回复
我不想写成下面这种强转的调用方式,该怎么写?

CContext *pContextA = new CContext((CStrategy*&)pTmp);
ye667788 2014-05-06
  • 打赏
  • 举报
回复
引用 5 楼 zcdabing 的回复:
CStrategy *& 我在想你这个想表达什么 指针还加个引用?
加上引用可以修改指针本身
zcdabing 2014-05-06
  • 打赏
  • 举报
回复
CStrategy *& 我在想你这个想表达什么 指针还加个引用?
版主大哥 2014-05-06
  • 打赏
  • 举报
回复
“CContext::CContext(CStrategy *&)”: 不能将参数 1 从“CConcreteStrategyA *”转换为“CStrategy *&” 不是报错了?
Restart_2013 2014-05-06
  • 打赏
  • 举报
回复
引用 2 楼 xihu1364 的回复:

CConcreteStrategyA *pTmp = NULL; //这里为啥不写成CStrategy* pTmp = new CConcreteStrategyA(); 呢?
pTmp = new CConcreteStrategyA();
CContext *pContextA = new CContext(pTmp);
pContextA->ContextInterface();
delete pTmp;
delete pContextA;
哦,原来如此,为什么我那样就不行呢?

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧