LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1214|回复: 4

显示调用析构函数,编译时提示错误。

[复制链接]
发表于 2008-3-16 21:31:26 | 显示全部楼层 |阅读模式
我写一个软件,用glade和C++。


类的声明在文件 WindowAFST.hh,如下:
  1. class WindowAFST : public WindowAFST_glade
  2. {  
  3.         
  4.         public:
  5.         WindowAFST();
  6.         ~WindowAFST();
  7.         void on_mnuFileNew_activate();
  8.         void on_mnuFileOpen_activate();
  9.         void on_mnuFileExit_activate();
  10.         void on________t_1_activate();
  11.         void on_about1_activate();
  12.         void on_btnExecute_clicked();
  13.         void on_btnOpen_clicked();
  14.        
  15.         private:
  16.         void on_btnOpen_clicked_handler();
  17.         void on_mnuFileExit_activate_handler();
  18.         void on_mnuFileOpen_activate_handler();
  19. };
复制代码

类的定义在另一个文件WindowAFST.cc
  1. #include "config.h"
  2. #include "WindowAFST.hh"
  3. #include "WindowAFST_handler.cc"
  4. WindowAFST::WindowAFST()
  5. {  
  6. }
  7. WindowAFST::~WindowAFST()
  8. {  
  9.     Gtk::MessageDialog err_dialog("message", false, Gtk::MESSAGE_ERROR,Gtk::BUTTONS_OK, true);
  10.         err_dialog.run();
  11. }
  12. void WindowAFST::on_mnuFileNew_activate()
  13. {  
  14. }
  15. void WindowAFST::on_mnuFileOpen_activate()
  16. {
  17.         on_mnuFileOpen_activate_handler();
  18. }
  19. void WindowAFST::on_btnOpen_clicked()
  20. {  
  21.         on_btnOpen_clicked_handler();
  22. }
复制代码

还有一个文件WindowAFST_handler.cc中,写了部分成员函数的定义:
  1. #include "gtkmm.h"
  2. #include "iostream"
  3. void WindowAFST::on_mnuFileOpen_activate_handler()
  4. {
  5.   Gtk::FileChooserDialog dialog("Please choose a folder", Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER);
  6.   dialog.set_transient_for(*this);
  7.    
  8.   //Add response buttons the the dialog:
  9.   dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
  10.   dialog.add_button(Gtk::Stock::OPEN, Gtk::RESPONSE_OK);
  11.   
  12.   int result = dialog.run();
  13.   //Handle the response:
  14.   switch(result)
  15.   {
  16.     case(Gtk::RESPONSE_OK):
  17.     {
  18.       std::cout << "Select clicked." << std::endl;
  19.       std::cout << "Folder selected: " << dialog.get_filename() << std::endl;
  20.       break;
  21.     }
  22.     case(Gtk::RESPONSE_CANCEL):
  23.     {
  24.       std::cout << "Cancel clicked." << std::endl;
  25.       break;
  26.     }
  27.     default:
  28.     {
  29.       std::cout << "Unexpected button clicked." << std::endl;
  30.       break;
  31.     }
  32.   }
  33.   
  34. }
  35. void WindowAFST::on_mnuFileExit_activate_handler()
  36. {  
  37. WindowAFST::~WindowAFST();
  38. }
  39. void WindowAFST::on_btnOpen_clicked_handler()
  40. {  
  41.         on_mnuFileOpen_activate_handler();
  42. }
复制代码

请看第三个文件中的这部分:
void WindowAFST:n_mnuFileExit_activate_handler()
{  
WindowAFST::~WindowAFST();
}

原意是显式调用析构函数来退出程序。
可是编译的时候提示:
WindowAFST_handler.cc: In member function 'void WindowAFST:n_mnuFileExit_activ ate_handler()':
WindowAFST_handler.cc:48: error: no matching function for call to 'WindowAFST::~ WindowAFST()'
WindowAFST.hh:22: note: candidates are: virtual WindowAFST::~WindowAFST()
make: *** [WindowAFST.o] 错误 1

竟然说找不到析构函数,不知为什么。特向大侠们请教。
发表于 2008-3-17 12:27:34 | 显示全部楼层
...C++里面析构函数不要手工调用的。
最好你自己再写一个函数来用来退出。

要不这样:
  1. #include <iostream>
  2. using namespace std;
  3. class A {
  4. public:
  5.     A() {cout<<"Init"<<endl;};
  6.     ~A() {cout<<"XX"<<endl;};
  7. };
  8. int main() {
  9.     A *a = new A;
  10.     a->~A();
  11.     delete a;
  12.     cout<<"END"<<endl;
  13.     return 0;
  14. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-17 13:53:23 | 显示全部楼层
Post by dave3068;1827471
...C++里面析构函数不要手工调用的。
最好你自己再写一个函数来用来退出。

要不这样:

  1. #include <iostream>

  2. using namespace std;

  3. class A {
  4. public:
  5.     A() {cout<<"Init"<<endl;};
  6.     ~A() {cout<<"XX"<<endl;};
  7. };

  8. int main() {
  9.     A *a = new A;
  10.     a->~A();
  11.     delete a;
  12.     cout<<"END"<<endl;
  13.     return 0;
  14. }

复制代码


多谢前辈。我晚上试试。
回复 支持 反对

使用道具 举报

发表于 2008-3-17 16:52:54 | 显示全部楼层
析构函数在是对像释放时调用的,一般delete对像时,系统会调用
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-17 20:26:09 | 显示全部楼层
刚刚试验了一下,把以前的代码改为这样:
[PHP]void WindowAFST:n_mnuFileExit_activate_handler()
{
        this->~WindowAFST();
}[/PHP]

果然有用。编译没有出错,析构函数也被调用。但是有一个问题是:我在gnome的终端窗口中运行这个程序,窗口消失后,命令行里面没有出现提示符,仿佛程序还没有结束。
按一下Ctrl+c,程序才真正结束,出现提示符。

下午,我下了好几个gtkmm的开源软件,准备研习一下。后来发现Gparted的代码规模比较小,而且好像在glade生成的基础上改动比较小,我就读了读。
找了半天,发现人家用来退出程序的代码就一行:  this->hide();  。
:yun:... 愣了一会儿,想起来了。所有的窗口都是从Gtk::Window派生的。这hide一定是Gtk::Window的成员函数。
顿时觉得自己菜啊,以前看gtk的书,都丢脑后了。

于是把代码改成:
[PHP]void WindowAFST:n_mnuFileExit_activate_handler()
{
        this->hide();
}[/PHP]

这下,退出功能就正常了,能够自动显示提示符。


多谢 dave3068 和 netdigger 。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表