• 3984阅读
  • 6回复

[提问]关于调用自定义类的 [复制链接]

上一主题 下一主题
离线qazaq408
 

只看楼主 倒序阅读 楼主  发表于: 2014-11-21
工具ubuntukylin14.04 + Qt5.3 + g++4.8
书是GUI C++ Qt4编程

书里第3和第4章要做个MainWindow的程序(这例子太TM长了。。。。。。)

前面自己设计了一个对话框Dialog,然后这里要在MainWindow里面,点击菜单选项find的时候调用对话框Dialog
我在MainWindow里写了个私有槽
void MainWindow::find()
{
    if(!dialog)   //就是这句问题。。
     dialog = new Dialog(this);
     dialog->show();
}
然后我在构造函数里把这个槽和菜单里的QAction连接起来

编译后完成了程序,其他功能一切正常,但一点击菜单的find选项就显示  段错误
然后我把if(!dialog)这句注释掉了,重新编译后正常,但每次点击find选项就会跳出一个对话框

ps:这个东西还没做完。

我想问下为什么这句if(!dialog)会造成段错误..
离线begboy

只看该作者 1楼 发表于: 2014-11-21
qazaq408,您好!
  由于没有完整上下文程序,先假定dialog是能返回合理指针,
单从编程语句而言:
请把
   if(!dialog)   //就是这句问题。。
     dialog = new Dialog(this);
     dialog->show();

变成

     dialog = new Dialog(this);
     if(!dialog)   //就是这句问题。。
     dialog->show();
试试看。

祝好运!
begboy
离线dbzhang800

只看该作者 2楼 发表于: 2014-11-21
段错误的问题,是你自己没有将 dialog这个指针初始化为0造成的。

每次点击出一个新的对话框,是因为你给出的代码就是这么设计的。

建议补补C++基础
离线qazaq408

只看该作者 3楼 发表于: 2014-11-21
回 begboy 的帖子
begboy:qazaq408,您好!
  由于没有完整上下文程序,先假定dialog是能返回合理指针,
单从编程语句而言:
请把
   if(!dialog)   //就是这句问题。。
....... (2014-11-21 15:25) 

是这样的,Dialog是一个自定义类,然后设计一个窗体MainWindow,需要使用到这个类(对话框)
class MainWindow:public QMainWindow
{
.
  private
   Dialog* dialog;   //类定义声明
.
.
  private slots:
   void find();  //槽,用于显示Dialog
};
书上说在调用对话框Dialog之前有3中情况
1 这是第一次调用
2 以前调用过,但用户已经关闭了他
3 以前调用过,现在还是可见的

所以点击菜单,要判断这个对话框是否已经被打开,我注释掉这句后等于不判断是否已经存在这个对话框,所以每次点击菜单的时候都会新出现一个对话框
离线roywillow

只看该作者 4楼 发表于: 2014-11-21
dialog变量是个指针,声明之后的值是随机的,所以if(!dialog)返回值基本可以认为返回的是false,也就是说此时认为这个对话框早就被实例化过了,但实际上没有,它指向的是内存里随机的一个位置,直接使用肯定会报错
所以应该在dialog指针声明之后立刻就赋值为0,这样第一次打开的时候就会成功让if句返回true,此时就会认为对话框从来没创建过,需要建立一个新的
之后执行到这里就跳过,直接把之前实例化的那个显示出来,这样就能节约一部分时间同时又不会无谓地占用内存
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线qazaq408

只看该作者 5楼 发表于: 2014-11-21
回 roywillow 的帖子
roywillow:
dialog变量是个指针,声明之后的值是随机的,所以if(!dialog)返回值基本可以认为返回的是false,也就是说此时认为这个对话框早就被实例化过了,但实际上没有,它指向的是内存里随机的一个位置,直接使用肯定会报错
所以应该在dialog指针声明之后立刻就赋值为0,这样第一次打开的时候就会成功让if句返回true,此时就会认为对话框从来没创建过,需要建立一个新的
之后执行到这里就跳过,直接把之前实例化的那个显示出来,这样就能节约一部分时间同时又不会无谓地占用内存


书上是这样的,现在类里声明


书上的例子对话框名字是findDialog我写的类是Dialog其他都一样
然后在调用这个对话框(类),先要判断是否已经有这样一个对话框打开了,书上是这样判断的


离线qazaq408

只看该作者 6楼 发表于: 2014-11-22
回 roywillow 的帖子
roywillow:dialog变量是个指针,声明之后的值是随机的,所以if(!dialog)返回值基本可以认为返回的是false,也就是说此时认为这个对话框早就被实例化过了,但实际上没有,它指向的是内存里随机的一个位置,直接使用肯定会报错
所以应该在dialog指针声明之后立刻就赋值为0,这样第一次打开的时 .. (2014-11-21 21:31) 

饿,谢谢了,问题解决了
快速回复
限100 字节
 
上一个 下一个