函数不能访问同一个类中定义的对象.. !可能是一个错误?

Posted

技术标签:

【中文标题】函数不能访问同一个类中定义的对象.. !可能是一个错误?【英文标题】: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();

.. 有效!

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

【问题讨论】:

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

【讨论】:

以上是关于函数不能访问同一个类中定义的对象.. !可能是一个错误?的主要内容,如果未能解决你的问题,请参考以下文章

Java面向对象之内部类(访问格式)

虚函数******

对类中的成员函数的定义和声明最后添加一个const是什么意思?

如何访问用c#中的函数创建的对象

能定义在类中的内容

python类和函数的区别