嘿伙计们......自从我开始编写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()...任何处理foldersList的refreshFoldersList()内的代码会立即引发分段错误...我已经检查了指针值对于foldersList,当范围在browseFolders()和refreshFoldersList()时...值不匹配..它就像我正在尝试访问我不应该访问的东西,或者我正在尝试访问尚未初始化的对象..
有关此的任何线索吗?
一个相关的问题......我有另一个类MainWindow(继承自QMainWindow)..在这个类中我有一个Canvas类的实例..这个实例名为canvas ..我在MainWindow的构造函数中初始化canvas,并设置canvas的MainWindow实例的父对象初始化..基于此,我使用以下代码从Canvas类中访问MainWindow函数:
((MainWindow*)parent())->someFunctionDefinedInMainWindow();
之前,上面的代码曾经工作..但是就像2-3天前它突然停止了工作..现在它让我进入我正在调用的MainWindow函数(即someFunctionDefinedInMainWindow()),但是如果我试图访问MainWindow中定义的任何变量,我会得到一个Segmentation Fault,再次指针值不匹配..我解决这个问题的方法是将变量定义为:
void * papa;
..在Canvas中,然后当我初始化canvas时,我设置:
canvas->papa = this; //this being the MainWindow instance initializing canvas
现在我访问了MainWindow的函数:
((MainWindow*)papa)->someFunctionDefinedInMainWindow();
..哪个有效!
但同样,我想知道这些问题的本质。我做错了什么或什么?
答案 0 :(得分:4)
错误在这里(您对liaK的评论中的代码):
QListWidget *foldersList = new QListWidget();
您正在创建局部变量,而不是初始化类成员。将代码更改为:
foldersList = new QListWidget();
并且可能根本不需要foldersList作为指针,所以你的类声明可能是:
private:
QListWidget foldersList;
答案 1 :(得分:2)
答案 2 :(得分:1)
或者我正在尝试访问一个对象 还没有初始化
也许您正在尝试访问尚未初始化的对象?如何以及在何处初始化folderList?
答案 3 :(得分:1)
现在即使foldersList是私有的,refreshFoldersList()应该能够“看到”它,对吧?但在我的情况下它不能..!我首先在browseFolders()函数中初始化foldersList,然后从browseFolders()中调用refreshFoldersList()...任何处理foldersList的refreshFoldersList()内的代码会立即抛出分段错误
如果成员可见性有任何问题,您的代码甚至无法编译。您的段错误必须与其他内容相关。
我担心你必须为我们展示更多能够有效帮助你的代码。
此外,您正在使用C
强制转换,Qt
要求您撰写C++
。这只会让事情变得更糟。
所以而不是:
((MainWindow*)parent())-->someFunctionDefinedInMainWindow();
您应该使用dynamic_cast<>
或static_cast<>
,具体取决于您希望实现的目标。