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

Odpowiedz Nowy wątek
2016-08-27 13:39

Rejestracja: 7 lat temu

Ostatnio: 2 lata temu

Lokalizacja: Tutaj,obok

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ć?


Jeśli mój post jest dowodem mojej niekompetencji, to trudno, ale po to pytam, żeby się czegoś dowiedzieć.
edytowany 1x, ostatnio: kacper546, 2016-08-27 15:35

Pozostało 580 znaków

kq
2016-08-27 13:42
kq
Moderator C/C++

Rejestracja: 6 lat temu

Ostatnio: 1 minuta temu

Lokalizacja: Szczecin

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


Pozostało 580 znaków

2016-08-27 14:04

Rejestracja: 10 lat temu

Ostatnio: 11 godzin temu

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.


edytowany 1x, ostatnio: several, 2016-08-27 14:09

Pozostało 580 znaków

2016-08-27 14:33

Rejestracja: 4 lata temu

Ostatnio: 2 lata temu

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/[...]age/class#Forward_declaration

Przed rekursywnym includowaniem zabezpieczają nas jeszcze guardy #ifndef GUARD \n #define GUARD 1 - mlyszczek 2016-08-27 15:21
A forward declaration nie zawsze da się użyć. Nie zrobisz na przykład struct s { forwarded_struct f }; bo kompilator tutaj MUSI znać rozmiar forwarded_struct. Jakby tam był wskaźnik to nie byłoby problemu. - mlyszczek 2016-08-27 15:23

Pozostało 580 znaków

Odpowiedz

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