函数不能访问同一个类中定义的对象.. !可能是一个错误?
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<>
,具体取决于您想要实现的目标。
【讨论】:
以上是关于函数不能访问同一个类中定义的对象.. !可能是一个错误?的主要内容,如果未能解决你的问题,请参考以下文章