Vnořený include způsobí "error C2504: base class undefined" – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Vnořený include způsobí "error C2504: base class undefined" – C / C++ – Fórum – Programujte.comVnořený include způsobí "error C2504: base class undefined" – C / C++ – Fórum – Programujte.com

 

BigBear0
Stálý člen
29. 3. 2014   #1
-
0
-

Ahojte, vlastně nevím, jak toto vlákno pojmenovat, protože nevím, čím ta chyba je. Domnívám se, že to je tím, že v souboru 1 volám include na soubor 2, ve kterém volám include na soubor 1. Jedná se o Qt aplikaci.

Tady je můj kód:

1. main.cpp

#include "MyWindow.h"

#include <QtWidgets/QApplication>
#include <QTranslator>

int main(int argc, char *argv[])
{
	QApplication application(argc, argv);

	QTranslator translator;
	if (translator.load(":/MyResource/cs_CZ"))
	{
		application.installTranslator(&translator);
	}
	
	MyWindow *win = new MyWindow();
	win->show();

	return application.exec();
}

2. MyWindow.h 

#ifndef MY_WINDOW_H
#define MY_WINDOW_H

#include <QtWidgets/QMainWindow>
#include "ui_myWindow.h"

//#include "Child.h"

class MyWindow : public QMainWindow
{
	Q_OBJECT

public:
	MyWindow(QWidget *parent = 0);
	~MyWindow();

	/*
	MyWindow* SetChild(Child *child) {
		this->p_child = child;
		return this;
	}
	Child* GetChild() { return this->p_child; }
	*/
private:
	Ui::MyWindowClass ui;
	//Child *p_child;
};

#endif // MY_WINDOW_H

3. MyWindow.cpp 

#include "MyWindow.h"

#include <QDebug>

MyWindow::MyWindow(QWidget *parent) : QMainWindow(parent)
{
	ui.setupUi(this);
}

MyWindow::~MyWindow()
{
	//delete p_child;
}

4. Parent.h 

#ifndef PARENT_H
#define PARENT_H

#include "MyWindow.h"

class Parent
{
public:
	Parent(MyWindow*);
	~Parent();

	virtual void draw() = 0;

protected:
	MyWindow *p_myWindow;
};

#endif // PARENT_H

5. Parent.cpp 

#include "Parent.h"

#include <QDebug>

Parent::Parent(MyWindow *win)
{
	this->p_myWindow = win;
}

Parent::~Parent()
{
	delete this->p_myWindow;
}

6. Child.h 

#ifndef CHILD_H
#define CHILD_H

#include "Parent.h"
#include "MyWindow.h"

class Child : public Parent
{
public:
	Child(MyWindow *win) : Parent(win) {};
	virtual void draw();
};

#endif // CHILD_H

7. Child.cpp 

#include "Child.h"

#include <QDebug>

void Child::draw()
{
	qDebug("drawing child...");
}

Stručně to popíšu:

1) Mám aplikaci, kde chci zobrazit jednu instanci každého potomka třídy Parent - tzn. že ve třídě MyWindow potřebuji "nainklůdovat" všechny hlavičkové soubory potomků

2) Jelikož budu v potomcích využívat funkcí UI, potřebuji si svoji aplikaci (tedy MyWindow) předat v konstruktoru třídy Parent, proto #include "MyWindow.h"

Problém je v souboru MyWindow.h. Když totiž odkomentuji řádek: #include "Child.h", aplikace se nespustí a najednou dostanu spoustu chyb v souboru Parent.h a Child.h:

Child.h(8): error C2504: 'Parent' : base class undefined
Child.h(10): error C2061: syntax error : identifier 'MyWindow'
Child.h(10): error C2065: 'win' : undeclared identifier
Child.h(10): error C2614: 'Child' : illegal member initialization: 'Parent' is not a base or member
...... a další ......

Mohl byste mi někdo, prosím, poradit, v čem mám chybu?

Dík moc.

Nahlásit jako SPAM
IP: 194.228.20.–
NECIN DRUHYM TO, CO NECHCES, ABY ONI CINILI TOBE!
KIIV
~ Moderátor
+43
God of flame
29. 3. 2014   #2
-
0
-

pripada mi to jako cyklicka zavislost .. mozna se pletu ale v   MyWindow.h  includujes  Child.h  v nem   Parent.h   a v obou taky includujes zase MyWindow.h ... akorat uvnitr MyWindow.h mas uz definovane makro MY_WINDOW_H  a tim vesmes memas nic naincludovaneho pred tim nez to pak pouzivas... proste prasarna

kdyztak si nech pri kompilaci projet jen preprocesor at vidis co z toho vylejza

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
BigBear0
Stálý člen
29. 3. 2014   #3
-
0
-

Super, díky za odpověď, i já jsem to viděl jako prasárnu, jen mě v první chvíli nenapadlo řešení. Potom, co jsi to tak pěkně sepsal mě napadlo řešení. Vyřešil jsem to tím, že si do třídy Parent neukládám ukazatel na celou aplikaci (tedy MyWindow), ale jen na ui (tj Ui::MyWindowClass). Uvnitř UI si totiž neincluduji žádný soubor, který by mohl cyklit. Soubor s definicí Ui::MyWindowClass je totiž generován automaticky knihovnou Qt.

Ještě jednou dík, přeji pěkný zbytek víkendu :-).

Nahlásit jako SPAM
IP: 194.228.20.–
NECIN DRUHYM TO, CO NECHCES, ABY ONI CINILI TOBE!
KIIV
~ Moderátor
+43
God of flame
29. 3. 2014   #4
-
0
-

tak aspon ze to pomohlo.. jinak nekdy se da pouzit jen deklarace tridy:

class Parent;   abys splnil zavislosti a tak.. ale jde to pouzit jen do doby, nez kompilator potrebuje znat presnou implementaci te tridy... (nejlepsi je to prave mit rozdelene mezi headerem, kde se pouzije neuplna implementace a pak do cpp souboru se includuje uz komplet trida)

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 19 hostů

Podobná vlákna

Float-right způsobí "margin"? — založil Radek Chalupa

Vnorený cyklus for — založil wicked

Vnořený dotaz — založil RePRO

Vnořený cyklus — založil Felix

Include — založil Zelenáč

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý