Функции не могут получить доступ к объектам, определенным в том же классе ..!Возможно ошибка? - PullRequest
0 голосов
/ 05 июля 2010

Привет, ребята .. Ну, с тех пор, как я начал программировать на Qt, у меня были проблемы с видимостью объектов, которые я определил ... До сих пор мне удавалось найти способы обойти эти вещи, нотеперь это становится раздражающим ..

Например, у меня есть этот класс, названный Canvas:

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

private:
    QListWidget *foldersList;

};

#endif // CANVAS_H

Теперь, даже если folderList является закрытым, refreshFoldersList () должен иметь возможность его видеть, право ?Но в моем случае это не может ..!Сначала я инициализирую folderList в функции browseFolders (), а затем из функции browseFolders () вызываю функцию refreshFoldersList () ... Любой код в refreshFoldersList (), работающий с folderList, немедленно вызывает ошибку сегментации ... Я проверил значения указателядля folderList, когда область видимости находится в browseFolders () и refreshFoldersList () .. значения не совпадают .. это как будто я пытаюсь получить доступ к тому, чего не должен, или пытаюсь получить доступ кобъект, который еще не был инициализирован ..

Есть какие-либо подсказки по этому поводу?

Связанная проблема ... У меня есть другой класс MainWindow (унаследованный от QMainWindow) .. В этом классе у меня естьэкземпляр класса Canvas .. этот экземпляр называется canvas .. Я инициализирую canvas в конструкторе MainWindow и устанавливаю родительский объект canvas для экземпляра MainWindow, инициализируя его .. На основании этого я использовал следующий код для доступа к функции MainWindow изнутриХолст класс:

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

До того, как выше сОда раньше работала ... но потом, как 2-3 дня назад, она внезапно перестала работать ... Теперь он оказался внутри функции MainWindow, которую я вызывал (а именно someFunctionDefinedInMainWindow ()), но оттуда, если я попытался получить доступлюбая переменная, определенная в MainWindow, я получил ошибку сегментации, опять же со значениями указателя, не совпадающими .. Я решил это путем определения переменной как:

void * papa;

.. внутри Canvas, а затем, когда яЯ установил инициализированный холст:

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

Теперь я получил доступ к функциям MainWindow следующим образом:

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

.., который работает!

Но опять же, я хотел бызнать природу этих проблем .. я что-то делаю не так или как?

Ответы [ 4 ]

4 голосов
/ 05 июля 2010

Ошибка здесь (код из вашего комментария к liaK):

QListWidget *foldersList = new QListWidget();

Вы создаете локальную переменную вместо инициализации члена класса. Измените код на:

foldersList = new QListWidget();

И, вероятно, вообще не нужно, чтобы folderList был указателем, поэтому объявление вашего класса может быть:

private:
    QListWidget foldersList;
2 голосов
/ 05 июля 2010

выдает ошибку сегментации

Возможно, какая-то ошибка в вашей инициализации. Как вы ее инициализируете ?? Показ кода будет полезен.

И вы используете --> вместо ->

Проверьте эту ссылку

Конечно, это не ошибка в Qt.

1 голос
/ 05 июля 2010

Теперь, несмотря на то, что folderList является закрытым, refreshFoldersList () должен иметь возможность «видеть» его, верно? Но в моем случае это не может ..! Сначала я инициализирую folderList в функции browseFolders (), а затем из функции browseFolders () я вызываю refreshFoldersList () ... Любой код в refreshFoldersList (), работающий с folderList, немедленно вызывает ошибку сегментации

Если бы была какая-то проблема с видимостью членов, ваш код даже не скомпилировался бы. Ваш segfault должен быть связан с чем-то другим.

Боюсь, вам придется показать больше кода, чтобы мы могли помочь вам эффективно.

Кроме того, вы используете C приведений, в то время как Qt требует, чтобы вы написали C++. Это может только усугубить ситуацию.

Так что вместо:

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

Вы должны использовать либо dynamic_cast<>, либо static_cast<>, в зависимости от того, чего вы хотите достичь.

1 голос
/ 05 июля 2010

или я пытаюсь получить доступ к объекту, который еще не был инициализирован

Возможно, вы пытаетесь получить доступ к объекту, который еще не был инициализирован?Как и где вы инициализируете folderList?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...