关于代理类的小问题。

hot1985 2003-08-18 04:51:03
我有些不明白Interface::Interface( int v ) :Ptr( new Implementation( v ) ) {} 这段代码中为什么要new? 能否说明一下!谢谢!
Implementation类:

class Implementation
{
public:
Implementation( int v) { value = v; }
int getValue() const { return value; }

private:
int value;
};

Interface类:

class Implementation;

class Interface
{
public:
Interface( int );
int getValue() const;

private:
Implementation *Ptr;
};

对应源文件:
#include "Interface.h"
#include "Implementation.h"

Interface::Interface( int v ) :Ptr( new Implementation( v ) ) {} //<-这个
int Interface::getValue () const
{
return Ptr->getValue( );
}

主函数:
#include <iostream.h>
#include "Interface.h"

void main()
{
Interface i( 5 );
cout<<"Interface contains: "<<i.getValue ()
<<"before setValue"<<endl;

}

...全文
51 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lemonutzf 2003-08-18
  • 打赏
  • 举报
回复

别忘了在 代理类 的析构函数中 delete Ptr
就是了
blueuser 2003-08-18
  • 打赏
  • 举报
回复
在andrew koenig and barbara moo所著的rumination in c++中谈到了代理类的问题.
将一个对象绑定到代理类可以通过操作该代理类的对象来间接操作所绑定的对象,关于如何绑定的问题,有几种方法1)通过复制该对象到代理类中,但是这样将无法操作有继承层次关系的类2)将对象的指针传入,这样可以实现对象类型的动态识别,但是如果原对象被删除,则代理类中的对象将无所适从3)new一个该对象,将该对象副本的指针传入,这样可以保证即能够象操作原对象般操作代理类,又解决了原对象在代理类外的声明周期问题.
ppm07 2003-08-18
  • 打赏
  • 举报
回复
Ptr是一个Implementation *,new Implementation( v )返回的也是一个Implementation *,不是正好吗 ?
如果你不习惯,你可以这样写:
Interface::Interface( int v )
{
Ptr = new Implementation( v );
}
这两者都是一样的。
但如果Ptr被定义为是一个const指针的话,就只能采用
Interface::Interface( int v ) :Ptr( new Implementation( v ) ) {} 了。
aflyinghorse 2003-08-18
  • 打赏
  • 举报
回复
Interface中保存的是Implementation *Ptr;
所以用new返回一个Implementation * 不挺合适吗

64,637

社区成员

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

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