Dlaczego deklaracja wskaźnika wewnątrz klasy powoduje błąd - Qt5, QtCreator

0

Witam

Mam klasę Application oraz MainWindow - chciałem z klasy MainWindow wywoływać publiczne metody udostępniane przez Application.
Postanowiłem że w konstruktorze klasy będę podawał wskaźnik do obiektu klasy Application;
Żeby móc zadeklarować wskaźnik typu Application muszę dołączyć plik "Application.hpp" lecz wykonanie tego kroku powoduje dziwne błędy.
Dodam jeszcze że raz kompilacja działa a raz kompilator wyrzuca błąd - miałem taki lifehack jak skompilować program ale teraz nie chce on działać :(
Przykładowe błędy - 'MainWindow' does not name a type lub **'m_mainWindow' was not declared in this scope **

Pliki źródłowe: skasowano

Korzystam z QtCreatora, używam biblioteki Qt5, Windows 7
Co powoduje wyżej wymienione błędy oraz jak je naprawić?

3

Żeby zadeklarować wskaźnik wystarczy Ci forward-deklaracja, którą zresztą masz.

#include użyj tam gdzie faktycznie używasz tej klasy.

Przydatna lektura: http://jonjagger.blogspot.com/2013/04/the-include-test.html

2
#include "Application.hpp"
class Application;

Tiaaa...
A tak poza tym, szukasz problemu tam gdzie go nie ma. W pliku MainWindow.hpp inkludujesz plik Application.hpp gdzie również masz inkluda do MainWindow.hpp

#ifndef APPLICATION_H
#define APPLICATION_H

#include "MainWindow.hpp"                           // <-------------
#include "QuestionBox.hpp"
#include "ChangeConfigurationDialogBox.hpp"
#include <QApplication>
#include "ConfigurationFileReader.hpp"
#include <QObject>

A w MainWindow.hpp

#ifndef MAINWINDOW_HPP
#define MAINWINDOW_HPP

#include <QMainWindow>

namespace Ui {
class MainWindow;
}
#include "Application.hpp"                 // <----- suprise madafaka
class Application;

@kq podlinkował fajny (bo krótki i konkretny) wpis od którego możesz zacząć usesytmatyzowanie swoich inkludów.

2

Koledzy wyżej wyjaśnili co masz zrobić, ale nie dlaczego.

"#include" to strasznie głupie macro- jedyne co robi, to wkleja zawartość pliku podanego pliku. W momencie, gdy MainWindow.hpp i Application.hpp includują się nawzajem, powstaje nieskończona pętla- dokleja jeden plik, a tam znowu jakiś #include i tak w nieskończoność. Rozwiązaniem tego problemu jest wymienione wcześniej forward-declaration. Daje znać kompilatorowi "ej, ziomek, dla twojej informacji- takie coś istnieje!" bez konieczności dołączania jego deklaracji.

forward-declaration na pewno już używałeś przy nauce programowania funkcyjnego- wtedy ponad funkcją main() pisałeś tylko jak funkcja ma wyglądać, a pod nią (funkcją ''main() ofc) pisałeś ciało tej funkcji.

Inna przydatna lektura: http://en.cppreference.com/w/cpp/language/class#Forward_declaration

1 użytkowników online, w tym zalogowanych: 0, gości: 1