【问题标题】:Functions cannot access objects defined in the same class .. ! Possibly a bug?函数不能访问同一个类中定义的对象.. !可能是一个错误?
【发布时间】:2010-07-05 13:08:48
【问题描述】:

嘿伙计们 .. 自从我开始使用 Qt 编程以来,我一直在我定义的对象的范围可见性方面遇到问题 .. 直到现在我已经设法找到解决这些问题的方法,但是现在越来越烦人了..

例如,我定义了一个名为 Canvas 的类:

class Canvas : public QWidget//, public MainWindow
{
    Q_OBJECT
public:
    void refreshFoldersList(QString inputPath);
    void browseFolders();

private:
    QListWidget *foldersList;

};

#endif // CANVAS_H

现在即使foldersList 是私有的,refreshFoldersList() 也应该能够“看到”它,对吧?但就我而言,它不能..!我首先在browseFolders()函数中初始化foldersList,然后在browseFolders()中,我调用refreshFoldersList()...... refreshFoldersList()中处理foldersList的任何代码都会立即引发分段错误......我已经检查了指针值当范围在browseFolders()和refreshFoldersList()中时,对于foldersList ..值不匹配..就像我正在尝试访问我不应该访问的东西,或者我正在尝试访问尚未初始化的对象..

这有什么线索吗?

一个相关的问题...我有另一个类 MainWindow(继承自 QMainWindow)..在这个类中我有一个 Canvas 类的实例..这个实例被命名为 canvas..我在 MainWindow 的构造函数中初始化画布,并设置初始化它的 MainWindow 实例的画布的父级.. 基于此,我使用以下代码从 Canvas 类中访问 MainWindow 函数:

((MainWindow*)parent())->someFunctionDefinedInMainWindow();

之前,上面的代码过去可以工作..但是就像 2-3 天前它突然停止工作..现在它让我进入了我正在调用的 MainWindow 函数(即 someFunctionDefinedInMainWindow() ),但是从那里,如果我尝试访问 MainWindow 中定义的任何变量,我会遇到分段错误,指针值不匹配。我解决此问题的方法是将变量定义为:

void * papa;

..在Canvas里面,然后我初始化canvas的时候,我设置:

canvas->papa = this; //this being the MainWindow instance initializing canvas

现在我像这样访问 MainWindow 的函数:

((MainWindow*)papa)->someFunctionDefinedInMainWindow();

.. 有效!

但是,我想知道这些问题的本质..我做错了什么还是什么?

【问题讨论】:

  • 永远不要责怪编译器/环境/框架。没有冒犯,但是...更有可能的是:您犯了错误还是他们犯了?
  • 发布方法实现让你更轻松。
  • 我总是遇到这样的情况,当我说语言中的一个错误时,我的同事会从我的应用程序中更改一段代码 - 让它工作并会说,“看看错误在哪里" :)

标签: c++ qt


【解决方案1】:

错误在这里(代码来自您对 liaK 的评论):

QListWidget *foldersList = new QListWidget();

您正在创建一个局部变量,而不是初始化类成员。将代码更改为:

foldersList = new QListWidget();

可能根本不需要foldersList 作为指针,所以你的类声明可以是:

private:
    QListWidget foldersList;

【讨论】:

    【解决方案2】:

    引发分段错误

    你的初始化可能有一些错误。你是如何初始化它的??显示代码会很有帮助。

    您使用的是--> 而不是->

    看看这个link

    确定不是 Qt 的错误。

    【讨论】:

    • 我确定这是一个错字。代码不会编译或者......会吗?除非someFunctionDefinedInMainWindow() 被定义并返回一个值。
    • 是的,我同意.. 但是看了他的问题后但是就像 2-3 天前它突然停止工作,我认为这可能不是错字.
    • 代码编译完美..这是初始化代码:'QListWidget *foldersList = new QListWidget();'而且我正在使用 -> 不是 -> .. :) 如果有任何错字,它将无法编译.. 相信我,伙计们,我详细讨论了这些问题..
    • @ahmad,您如何将值插入到列表小部件中??
    • 像这样:foldersList->addItems(*foldersStringList);
    【解决方案3】:

    或者我正在尝试访问一个对象 还没有初始化

    也许您正在尝试访问尚未初始化的对象?您如何以及在何处初始化文件夹列表?

    【讨论】:

    • 我认为您没有阅读我的所有声明.. :P .. 我已经初始化了文件夹列表,并且我在调用 refreshFoldersList() 之前就这样做了.. 在 browseFolders() 中初始化了文件夹列表。 .
    【解决方案4】:

    现在即使foldersList 是私有的,refreshFoldersList() 也应该能够“看到”它,对吧?但就我而言,它不能..!我首先在browseFolders() 函数中初始化foldersList,然后在browseFolders() 中调用refreshFoldersList() ... refreshFoldersList() 中处理foldersList 的任何代码都会立即引发分段错误

    如果成员可见性有任何问题,您的代码甚至无法编译。您的段错误必须与其他内容有关。

    恐怕您必须展示更多代码,我们才能有效地为您提供帮助。

    此外,您正在使用C 强制转换,而Qt 要求您编写C++。那只会让事情变得更糟。

    所以而不是:

    ((MainWindow*)parent())-->someFunctionDefinedInMainWindow();
    

    您应该使用dynamic_cast<>static_cast<>,具体取决于您想要实现的目标。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-02
      • 2020-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-09
      • 2016-06-28
      • 1970-01-01
      相关资源
      最近更新 更多