一个关于类设计的小问题

xlfddlfd 2007-06-10 05:58:18
我要读取几种图像文件,有BMP/JPEG等格式的。我首先设计了个虚拟基类CImage,成员函数有Load(char * file)和Display( ),这两个都是纯虚拟的。然后派生了几个类,分别为CBitmap,CJpeg等,分别实现了载入和显示的函数。
使用的时候先定义个基类的指针pCImage,但是我怎么使用载入函数啊???难道要先定义BMP/JPEG的对象,再把pCImage指向他们???这样派生类的作用体现在哪里?(唯一的好处就是显示的时候可以用同一个基类指针显示他们。。。)那我何不直接用BMP/JPEG的对象调用成员函数显示得了!!??
另外在载入图像的时候还有一个判断图像类型的问题,怎么看怎么别扭。。。各位帮帮忙。。我已经黔驴技穷了。。。应该怎么设计啊???
不是小气哈,就这么点分。。。先谢谢各位了。
...全文
416 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
xlfddlfd 2007-06-12
  • 打赏
  • 举报
回复
《Exceptional C++》英文版电子书到处都有,去网上搜一下吧,我就不发了。

强烈建议你使用std::string。

//////////////////////////////////////
一不小心找了个中文版^_^已经下载了,正在学习中。。。使用std::string是英明滴,最起码刚才的代码不会出现问题。不过使用char *的好处还是有滴,最起码让我知道了我对析构的一个错误认识^_^。不经一堑,不长一智,谢谢你的提醒^_^
请接着讨论7楼的代码,看有没有问题^_^
点滴皆收获 2007-06-12
  • 打赏
  • 举报
回复
可能主要看你的应用需求,
在使用泛化的关系时适用于比较复杂的应用,或者预留较多的可扩展性,
如果只是读取和显示的话,
个人感觉可以在一个类内完成,
或者将文件读取等操作类独立与CBitmap,CJpeg,
使用关联关系。
xlfddlfd 2007-06-12
  • 打赏
  • 举报
回复

关于CImage::~CImage()是错误的是这个问题的一方面哈,主要是大家帮我看下7楼的轮廓设计是否正确,我总是觉得这个方法很别扭,如果你们设计的话会是什么样子的?能给个大概的轮廓代码吗?
iambic 2007-06-12
  • 打赏
  • 举报
回复
《Exceptional C++》英文版电子书到处都有,去网上搜一下吧,我就不发了。

强烈建议你使用std::string。
xlfddlfd 2007-06-12
  • 打赏
  • 举报
回复
可能CImage::~CImage()销毁了虚函数表。我觉得无所谓,反正是个非法的做法。

///////////////////////////////////////
应该是这句有问题,我把这句注释了也能得到正确结果。。。
至于你说的那本书我这里没有,能不能发个过来.szg993119@163.com谢谢^_^
点滴皆收获 2007-06-12
  • 打赏
  • 举报
回复
诚如iambic所言!
iambic 2007-06-12
  • 打赏
  • 举报
回复
至于直接调用CImage::~CImage()的危害,参考《Exceptional C++》Item 40~41:
Item 40. Object Lifetimes - part 1
Item 41. Object Lifetimes - part 2
iambic 2007-06-12
  • 打赏
  • 举报
回复
可能CImage::~CImage()销毁了虚函数表。我觉得无所谓,反正是个非法的做法。

iambic 2007-06-12
  • 打赏
  • 举报
回复
我没有仔细看代码,感觉有点乱。

说下我在VC下的输出结果吧:


如果去掉这一行:
CImage::~CImage( ) ;

输出结果是:
CBitmap::Display( )
bitmap1
CBitmap::Display( )
bitmap1

如果加上这一行:
CImage::~CImage( ) ;

输出结果是:
bitmap1
bitmap1
xlfddlfd 2007-06-12
  • 打赏
  • 举报
回复
我看到的执行结果是:
CBitmap::Display( )
bitmap1
CBitmap::Display( )
bitmap1

别告诉我你是用VC编的,添加子类方法后没有重译编译!:)


////////////////////////////////////////////////
实不相瞒,确实是VC^_^,肯定重新编译了,不过不知道结果为什么不对。。。
xlfddlfd 2007-06-12
  • 打赏
  • 举报
回复
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( ) ;######这样调用都行?


/////////////////////////////////////////////////////////////
当时写的时候以为可以直接delete [ ] m_file ;后来发现不可以访问基类的私有成员,于是就有了上面的代码。。。不过后来又把基类的m_file设为protected 了。后面的代码我没改。。。
我测试过内存泄漏,上面的代码没有问题,可以运行^_^
点滴皆收获 2007-06-12
  • 打赏
  • 举报
回复
我看到的执行结果是:
CBitmap::Display( )
bitmap1
CBitmap::Display( )
bitmap1

别告诉我你是用VC编的,添加子类方法后没有重译编译!:)
点滴皆收获 2007-06-12
  • 打赏
  • 举报
回复
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( ) ;######这样调用都行?

xlfddlfd 2007-06-12
  • 打赏
  • 举报
回复
我说下你代码的问题吧:

bool CBitmap::Load( const char * file )
{
CImage::~CImage( ) ;
int len = strlen(file) ;
m_file = new char[ len + 1 ] ;
strcpy( m_file , file ) ;
}

这是一个非常糟糕而且肮脏的行为。

学习使用std::string。

/////////////////////////////
没错,确实这样滴。不过我只想写个测试代码,所以只想写的快点。我写到这行代码的时候想用string发现还要加个头文件,于是就偷懒了那么一下(实际上反而又多打了几个字。。。)
xlfddlfd 2007-06-12
  • 打赏
  • 举报
回复
class CImage
{
protected :
char * m_file ;
public :
CImage( ) ;
virtual bool Load( const char * file ) = 0 ;
virtual void Diaplay( ) const ; //should be Display
virtual ~CImage( ) ;
} ;

//////////////////////////////////////////////////////
真晕了,打错了N个字母编译竟然通过了^_^。不过改过来之后结果还是不对哦。。。
iambic 2007-06-12
  • 打赏
  • 举报
回复
我说下你代码的问题吧:

bool CBitmap::Load( const char * file )
{
CImage::~CImage( ) ;
int len = strlen(file) ;
m_file = new char[ len + 1 ] ;
strcpy( m_file , file ) ;
}

这是一个非常糟糕而且肮脏的行为。

学习使用std::string。


fallinleave 2007-06-12
  • 打赏
  • 举报
回复
哇赛,就是一字之差
想起联通的一个重大错误:系统怎么都不工作,最后发现Parse写成了Prase().....
fflush 2007-06-12
  • 打赏
  • 举报
回复
class CImage
{
protected :
char * m_file ;
public :
CImage( ) ;
virtual bool Load( const char * file ) = 0 ;
virtual void Diaplay( ) const ; //should be Display
virtual ~CImage( ) ;
} ;
fallinleave 2007-06-12
  • 打赏
  • 举报
回复
我没有看出来问题。。。
按理来说你的程序没什么错误,应该调用派生类的函数
可能眼拙,休息一下再看
xlfddlfd 2007-06-12
  • 打赏
  • 举报
回复
Load()内部逻辑应该是virtual的,由子类来实现。

//////////////////////////////////////////////
我的Load函数是虚拟的哈,子类也改写了,但是没有实现多态。。。
加载更多回复(14)

64,683

社区成员

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

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