读书人

一个关于类设计的小疑点

发布时间: 2012-03-09 21:42:54 作者: rapoo

一个关于类设计的小问题
我要读取几种图像文件,有BMP/JPEG等格式的。我首先设计了个虚拟基类CImage,成员函数有Load(char * file)和Display( ),这两个都是纯虚拟的。然后派生了几个类,分别为CBitmap,CJpeg等,分别实现了载入和显示的函数。
使用的时候先定义个基类的指针pCImage,但是我怎么使用载入函数啊???难道要先定义BMP/JPEG的对象,再把pCImage指向他们???这样派生类的作用体现在哪里?(唯一的好处就是显示的时候可以用同一个基类指针显示他们。。。)那我何不直接用BMP/JPEG的对象调用成员函数显示得了!!??
另外在载入图像的时候还有一个判断图像类型的问题,怎么看怎么别扭。。。各位帮帮忙。。我已经黔驴技穷了。。。应该怎么设计啊???
不是小气哈,就这么点分。。。先谢谢各位了。

[解决办法]
看看CxImage 的设计结构吧 ...


[解决办法]
你这样设计和使用基类是多态方面的问题。
这洋使用基类指针的话,如果以后又有什么新的图象格式,就可以直接使用这个函数,而不用改变这个函数的任何东西。如果你直接使用CBitmap或CJpeg的话,在添加新图象而且使用这个函数就必须从这两个类之一继承了。
[解决办法]
void load(CImage* p) throw (WrongTypeFrmtGraph IOException)
{
p-> Load();
p-> show();
}
void hide(CImage* p) throw(UserDefExceptions)
{
p-> hide();
}
由于后期绑定机制存在,这套代码不需要经常维护了。别人使用你的类库更方便了
[解决办法]
我看了一下你的需求,典型的Factory 模式。
你参考一下完全实现你的要求。
[解决办法]
光从 load 来看确实体现不出用基类/派生的方法有什么好处。
但是实际情况是可能只有一个地方 load, 很多地方显示,去图像大小之类的操作等,那在 load 之外的代码就可以享受多态的方便了
[解决办法]
Load()内部逻辑应该是virtual的,由子类来实现。

[解决办法]
class CImage
{
protected :
char * m_file ;
public :
CImage( ) ;
virtual bool Load( const char * file ) = 0 ;
virtual void Diaplay( ) const ; //should be Display
virtual ~CImage( ) ;
} ;
[解决办法]
bool CBitmap::Load( const char * file )
{
CImage::~CImage( ) ;
int len = strlen(file) ;
m_file = new char[ len + 1 ] ;
strcpy( m_file , file ) ;
return true ;
}

中#######CImage::~CImage( ) ;######这样调用都行?

读书人网 >C++

热点推荐