problem mit meinem neu aufgeteilten projekt...



  • ich hatte zuerst 2 klassen in einer datei definiert. das ganze hat auch funktioniert und der code wurde kompilliert. nun habe ich aus übersichtlichkeitsgründen die klassen in eigene *.hpp dateien gepackt.

    das ganze sieht ungefähr so aus:

    #include <QtGui>
    #include <iostream>
    #include "text_reader.hpp"
    #include "MyBoardWDG.hpp"
    #include "unit_type_HQ.hpp"
    
    static const int width = 1065;
    static const int height = 475;
    
    int main(int argc, char *argv[])
    {
    	QApplication app(argc, argv);
    	MyBoardWDG widget;
    	widget.resize(width, height);
    
    	widget.show();
    	return app.exec();
    }
    
    //#include "dgd.moc"
    

    das #include "dgd.moc" war wegen der vorher in dieser datei stehenden klassen nötig..

    #ifndef MYBOARDWDG_HPP
    
    #define MYBOARDWDG_HPP
    
    #include <QtGui>
    #include <iostream>
    #include "text_reader.hpp"
    #include "unit_type_HQ.hpp"
    
    enum armee_bereich
    {
    	HQ,
    	Elite,
    	Standard,
    	Sturm,
    	Unterstuetzung
    };
    
    class MyBoardWDG : public QWidget//unit_type_HQ
    {
    	Q_OBJECT
    private:
    	QTableWidgetItem *itm_u;
    	QTableWidgetItem *itm_e;
    
    	int index_hq;
    	int index_el;
    	int index_sd;
    	int index_st;
    	int index_ap;
    
    	QTabWidget *main_tab;
    	QTableWidget *armee_list;
    
    public:
    	MyBoardWDG(QWidget *parent = 0);
    	QVBoxLayout *armee_list_layout;
    	void create_armee_list_layout();
    
    	void addToArmee(QString unit, QString equip, armee_bereich area);
    
    public slots:/*
    	void addToArmeeList()
    	{
    		QString Unit;
    		QString Equipment;
    
    		Unit = (get_unit_name_combobox() ).section("\t", 0, 0);
    		for(int i = 0; i < (get_EquipList() ).size(); i++)
    		{
    			Equipment += (get_EquipList().at(i) ).section("\t", 0, 0);
    			if(i < (get_EquipList() ).size() - 1)
    				Equipment += ", ";
    		}
    
    		addToArmee(Unit, Equipment, Standard);
    	}*/
    };
    ...
    
    #endif
    

    und zuletzt

    #ifndef UNIT_TYPE_HPP
    
    #define UNIT_TYPE_HPP
    
    #include <QtGui>
    #include <iostream>
    #include "text_reader.hpp"
    #include "MyBoardWDG.hpp"
    
    class unit_type_HQ : public QWidget
    {
    	Q_OBJECT
    private:
    	int price;
    	int mod_e_price;
    	QStringList EquipList;
    
    	QComboBox *unit_name_combobox;
    	QLabel *label_unit_name;
    	QLabel *label_unit_pt;
    	QTableWidget *unit_profile_table; //QGroupBox *horizontalGroupBox_profile;
    	QListWidget *unit_equipment_list; //QGroupBox *verticalGroupBox_equip;
    	QLabel *unit_price_label; //void setUnit_price_label();
    
    	QStringList pre_conf_units;
    	QStringList pre_conf_profile;
    	QStringList pre_conf_equipment;
    	static const int rows = 2, columns = 9;
    
    public:
    	QStringList get_EquipList() 
    	{
    		return EquipList;
    	}
    	QString get_unit_name_combobox() 
    	{
    		return unit_name_combobox->currentText();
    	}
    
    	unit_type_HQ(QWidget *parent = 0, QStringList units = 0, QStringList equipment = 0);
    
    	QGroupBox *verticalGroupBox_equip;
    	void createVerticalGroupBox_equip();
    
    	QGroupBox *horizontalGroupBox_profile;
    	void createHorizontalGroupBox_profile();
    
    	void setProfileTable(QString);	//nie aufrufen
    	void setEquipList(QStringList);
    
    	static const int width = 350;
    	static const int height = 92;
    
    public slots:
    	void setUnitProfile(QString name)
    	{
    		QString str = read_profile("units.src", "/home/dgdaniel/develop/Qt/dgd/src/", name);
    		setProfileTable(str);
    		std::cout<<"Profil gesetzt von "<<name.toStdString()<<" mit: "<<str.toStdString()<<std::endl;
    	}
    
    	void setUnitEquipment(QString name = "all")
    	{
    		name = name.section('\t', 0, 0);
    		name = "#"+name+"#";
    		QStringList str_lst = read_elist("equip.src", "/home/dgdaniel/develop/Qt/dgd/src/", name);
    		setEquipList(str_lst);
    	}
    
    	void saveSelectedEquipment() //manipuliert auch den preis
    	{
    		EquipList.clear();
    		std::cout<<"Speichere Equipmentauswahl."<<std::endl;
    		QList<QListWidgetItem*> selectedEquipItems;
    		selectedEquipItems = unit_equipment_list->selectedItems();
    
    		std::cout<<selectedEquipItems.size()<<" Items ausgewaehlt."<<std::endl;
    		for(int i = 0; i < selectedEquipItems.size(); i++)
    		{
    			QListWidgetItem *item = selectedEquipItems.at(i);
    			QString item_txt = item->text();
    			std::cout<<"Speichere: "<<item_txt.toStdString()<<std::endl;
    			EquipList.append(item_txt);
    		}
    
    		mod_e_price = price;
    		mod_e_price += getPrice(0, EquipList, true);
    		std::cout<<mod_e_price<<std::endl;
    		unit_price_label->setText(QString::number(mod_e_price, 10) );
    	}
    
    	void setUnit_price(QString UName)
    	{
    		price = getPrice(UName, EquipList, false);
    		unit_price_label->setText(QString::number(price, 10) );
    		std::cout<<price<<std::endl;
    	}
    };
    ...
    #endif
    

    nun bekomm ich aber probleme

    [code]Linken der Datei ../bin/dgd (g++)
    dgd.o: In function unit\_type\_HQ': /home/dgdaniel/develop/Qt/dgd/src/unit\_type\_HQ.hpp:101: undefined reference tovtable for unit_type_HQ'
    /home/dgdaniel/develop/Qt/dgd/src/unit_type_HQ.hpp:101: undefined reference to vtable for unit\_type\_HQ' /home/dgdaniel/develop/Qt/dgd/src/unit\_type\_HQ.hpp:101: undefined reference tovtable for unit_type_HQ'
    /home/dgdaniel/develop/Qt/dgd/src/unit_type_HQ.hpp:101: undefined reference to vtable for unit\_type\_HQ' dgd.o: In functionMyBoardWDG':
    /home/dgdaniel/develop/Qt/dgd/src/MyBoardWDG.hpp:60: undefined reference to vtable for MyBoardWDG' /home/dgdaniel/develop/Qt/dgd/src/MyBoardWDG.hpp:60: undefined reference tovtable for MyBoardWDG'
    /home/dgdaniel/develop/Qt/dgd/src/MyBoardWDG.hpp:60: undefined reference to vtable for MyBoardWDG' /home/dgdaniel/develop/Qt/dgd/src/MyBoardWDG.hpp:60: undefined reference tovtable for MyBoardWDG'
    dgd.o: In function unit\_type\_HQ::tr(char const*, char const*)': /home/dgdaniel/develop/Qt/dgd/src/unit\_type\_HQ.hpp:12: undefined reference tounit_type_HQ::staticMetaObject'
    dgd.o: In function MyBoardWDG::tr(char const*, char const*)': /home/dgdaniel/develop/Qt/dgd/src/MyBoardWDG.hpp:21: undefined reference toMyBoardWDG::staticMetaObject'
    dgd.o: In function ~MyBoardWDG': /home/dgdaniel/develop/Qt/dgd/src/MyBoardWDG.hpp:20: undefined reference tovtable for MyBoardWDG'
    /home/dgdaniel/develop/Qt/dgd/src/MyBoardWDG.hpp:20: undefined reference to `vtable for MyBoardWDG'
    collect2: ld returned 1 exit status
    gmake[1]: *** [../bin/dgd] Fehler 1
    gmake: *** [sub-src-make_default] Fehler 2
    *** Beendet mit Status: 2 ***
    [code]

    was mach ich falsch?



  • mir ist noch aufgefallen das das prog zwar bei auskommentierten Q_OBJECT in der klassendefinition kompilliert, jedoch findet das prog dann keine slots mehr.

    void unit_type_HQ::createVerticalGroupBox_equip()
    {
    ...
    	QObject::connect(unit_name_combobox, SIGNAL(activated(QString) ), this, SLOT(setUnitEquipment(QString) ) );
    	QObject::connect(unit_equipment_list, SIGNAL(itemSelectionChanged() ), this, SLOT(saveSelectedEquipment() ) );
    	QObject::connect(unit_name_combobox, SIGNAL(activated(QString) ), this, SLOT(setUnit_price(QString) ) );
    	//QObject::connect(addUnit_But, SIGNAL(clicked() ), this, SLOT(addToArmeeList() ) );
    ...
    }
    
    Object::connect: No such slot QWidget::setUnitProfile(QString)
    Object::connect: No such slot QWidget::setUnitEquipment(QString)
    Object::connect: No such slot QWidget::saveSelectedEquipment()
    Object::connect: No such slot QWidget::setUnit_price(QString)
    


  • Du musst in deiner Klasse einen virtuellen Destruktor einbauen, dann klappts auch mit dem Linker.



  • warum brauche ich einen virtual-destructor? warum virtual?
    und wie muss der aussehen?

    virtual ~MyBoardWDG()
    	{
    	}
    

    und warum brauch ich erst einen nachdem ich die klassen auf zwei dateien aufgeteilt habe?



  • Hallo,

    den virtuelle Destruktor hast du korrekt geschrieben so sieht der aus. Allgemein ist es üblich, bei abgeleiteten Klassen virtuelle Destruktoren zu verwenden. Warum du den vorher nicht gebraucht hast, weiß ich nicht; wenn du dem G++ die Compileroption -Wall mitgibst, müsste der dich eigentlich warnen wenn du keinen verwendest.



  • problem ist nur das der fehler immer noch kommt... und ich normalerweise keine virtual memberfkt. habe 😮
    ich hab echt keine ahnung warum das nicht funzt



  • der compiler meckert sogar wegen dem destructor

    dgd.o: In function `unit_type_HQ':
    /home/dgdaniel/develop/Qt/dgd/src/unit_type_HQ.hpp:106: undefined reference to `vtable for unit_type_HQ'
    /home/dgdaniel/develop/Qt/dgd/src/unit_type_HQ.hpp:106: undefined reference to `vtable for unit_type_HQ'
    /home/dgdaniel/develop/Qt/dgd/src/unit_type_HQ.hpp:106: undefined reference to `vtable for unit_type_HQ'
    /home/dgdaniel/develop/Qt/dgd/src/unit_type_HQ.hpp:106: undefined reference to `vtable for unit_type_HQ'
    dgd.o: In function `MyBoardWDG':
    /home/dgdaniel/develop/Qt/dgd/src/MyBoardWDG.hpp:64: undefined reference to `vtable for MyBoardWDG'
    /home/dgdaniel/develop/Qt/dgd/src/MyBoardWDG.hpp:64: undefined reference to `vtable for MyBoardWDG'
    /home/dgdaniel/develop/Qt/dgd/src/MyBoardWDG.hpp:64: undefined reference to `vtable for MyBoardWDG'
    /home/dgdaniel/develop/Qt/dgd/src/MyBoardWDG.hpp:64: undefined reference to `vtable for MyBoardWDG'
    dgd.o: In function `unit_type_HQ::tr(char const*, char const*)':
    /home/dgdaniel/develop/Qt/dgd/src/unit_type_HQ.hpp:12: undefined reference to `unit_type_HQ::staticMetaObject'
    dgd.o: In function `MyBoardWDG::tr(char const*, char const*)':
    /home/dgdaniel/develop/Qt/dgd/src/MyBoardWDG.hpp:21: undefined reference to `MyBoardWDG::staticMetaObject'
    dgd.o: In function `~MyBoardWDG':
    /home/dgdaniel/develop/Qt/dgd/src/MyBoardWDG.hpp:38: undefined reference to `vtable for MyBoardWDG'
    /home/dgdaniel/develop/Qt/dgd/src/MyBoardWDG.hpp:38: undefined reference to `vtable for MyBoardWDG'
    collect2: ld returned 1 exit status
    gmake[1]: *** [../bin/dgd] Fehler 1
    gmake: *** [sub-src-make_default] Fehler 2
    *** Beendet mit Status: 2 ***
    


  • Hast du in deiner Makefile auch die entsprechenden .cpp Dateien eingebunden? Und alle Memberfunktionen implementiert?



  • also ich habe mal meine projekt-datei umgeschrieben und mir qmake ne neue makefile erzeugt...
    *.pro

    SOURCES += dgd.cpp
    HEADERS +=  MyBoardWDG.hpp unit_type_HQ.hpp text_reader.hpp
    
    CONFIG += debug console
    TARGET=../bin/dgd
    

    es kommt jetzt ein anderer fehler:

    Kompilieren der Datei dgd.cpp (g++)
    Erstellen der Datei moc_MyBoardWDG.cpp (moc)
    Kompilieren der Datei moc_MyBoardWDG.cpp (g++)
    Erstellen der Datei moc_unit_type_HQ.cpp (moc)
    Kompilieren der Datei moc_unit_type_HQ.cpp (g++)
    MyBoardWDG.hpp: In constructor ‘MyBoardWDG::MyBoardWDG(QWidget*)’:
    MyBoardWDG.hpp:75: error: expected type-specifier before ‘unit_type_HQ’
    MyBoardWDG.hpp:75: error: expected `)' before ‘unit_type_HQ’
    MyBoardWDG.hpp:75: error: no matching function for call to ‘QTabWidget::addTab(int*, QString)’
    /usr/local/Trolltech/Qt-4.1.0/include/QtGui/qtabwidget.h:50: note: candidates are: int QTabWidget::addTab(QWidget*, const QString&)
    /usr/local/Trolltech/Qt-4.1.0/include/QtGui/qtabwidget.h:51: note: int QTabWidget::addTab(QWidget*, const QIcon&, const QString&)
    MyBoardWDG.hpp:76: error: expected type-specifier before ‘unit_type_HQ’
    MyBoardWDG.hpp:76: error: expected `)' before ‘unit_type_HQ’
    MyBoardWDG.hpp:76: error: no matching function for call to ‘QTabWidget::addTab(int*, QString)’
    /usr/local/Trolltech/Qt-4.1.0/include/QtGui/qtabwidget.h:50: note: candidates are: int QTabWidget::addTab(QWidget*, const QString&)
    /usr/local/Trolltech/Qt-4.1.0/include/QtGui/qtabwidget.h:51: note: int QTabWidget::addTab(QWidget*, const QIcon&, const QString&)
    MyBoardWDG.hpp:77: error: expected type-specifier before ‘unit_type_HQ’
    MyBoardWDG.hpp:77: error: expected `)' before ‘unit_type_HQ’
    MyBoardWDG.hpp:77: error: no matching function for call to ‘QTabWidget::addTab(int*, QString)’
    /usr/local/Trolltech/Qt-4.1.0/include/QtGui/qtabwidget.h:50: note: candidates are: int QTabWidget::addTab(QWidget*, const QString&)
    /usr/local/Trolltech/Qt-4.1.0/include/QtGui/qtabwidget.h:51: note: int QTabWidget::addTab(QWidget*, const QIcon&, const QString&)
    MyBoardWDG.hpp:78: error: expected type-specifier before ‘unit_type_HQ’
    MyBoardWDG.hpp:78: error: expected `)' before ‘unit_type_HQ’
    MyBoardWDG.hpp:78: error: no matching function for call to ‘QTabWidget::addTab(int*, QString)’
    /usr/local/Trolltech/Qt-4.1.0/include/QtGui/qtabwidget.h:50: note: candidates are: int QTabWidget::addTab(QWidget*, const QString&)
    /usr/local/Trolltech/Qt-4.1.0/include/QtGui/qtabwidget.h:51: note: int QTabWidget::addTab(QWidget*, const QIcon&, const QString&)
    MyBoardWDG.hpp:79: error: expected type-specifier before ‘unit_type_HQ’
    MyBoardWDG.hpp:79: error: expected `)' before ‘unit_type_HQ’
    MyBoardWDG.hpp:79: error: no matching function for call to ‘QTabWidget::addTab(int*, QString)’
    /usr/local/Trolltech/Qt-4.1.0/include/QtGui/qtabwidget.h:50: note: candidates are: int QTabWidget::addTab(QWidget*, const QString&)
    /usr/local/Trolltech/Qt-4.1.0/include/QtGui/qtabwidget.h:51: note: int QTabWidget::addTab(QWidget*, const QIcon&, const QString&)
    MyBoardWDG.hpp:80: error: expected type-specifier before ‘unit_type_HQ’
    MyBoardWDG.hpp:80: error: expected `)' before ‘unit_type_HQ’
    MyBoardWDG.hpp:80: error: no matching function for call to ‘QTabWidget::addTab(int*, QString)’
    /usr/local/Trolltech/Qt-4.1.0/include/QtGui/qtabwidget.h:50: note: candidates are: int QTabWidget::addTab(QWidget*, const QString&)
    /usr/local/Trolltech/Qt-4.1.0/include/QtGui/qtabwidget.h:51: note: int QTabWidget::addTab(QWidget*, const QIcon&, const QString&)
    gmake[1]: *** [moc_unit_type_HQ.o] Fehler 1
    gmake: *** [sub-src-make_default] Fehler 2
    *** Beendet mit Status: 2 ***
    

    der beschränkt sich zum glück nur auf eine klasse. und zwar meckert er an der addTab-funktion, an der hatte mein compiler bisher nie gemeckert.

    enum armee_bereich
    {
    	HQ,
    	Elite,
    	Standard,
    	Sturm,
    	Unterstuetzung
    };
    
    class MyBoardWDG : public QWidget//unit_type_HQ
    {
    	Q_OBJECT
    private:
    	QTableWidgetItem *itm_u;
    	QTableWidgetItem *itm_e;
    
    	int index_hq;
    	int index_el;
    	int index_sd;
    	int index_st;
    	int index_ap;
    
    	QTabWidget *main_tab;
    	QTableWidget *armee_list;
    
    public:
    	MyBoardWDG(QWidget *parent = 0);
    	virtual ~MyBoardWDG()
    	{
    	}
    	QVBoxLayout *armee_list_layout;
    	void create_armee_list_layout();
    
    	void addToArmee(QString unit, QString equip, armee_bereich area);
    };
    
    /*######################################################################################*/
    MyBoardWDG::MyBoardWDG(QWidget *parent) : QWidget(parent)//unit_type_HQ(parent)
    {
    	index_hq = 2;
    	index_el = 6;
    	index_sd = 11;
    	index_st = 19;
    	index_ap = 23;
    
    	QHBoxLayout *mainLayout = new QHBoxLayout(this);
    
    	main_tab = new QTabWidget(this);
    	main_tab->addTab(new unit_type_HQ(0, read_plist("units.src", "/home/dgdaniel/develop/Qt/dgd/src/", hq) ), tr("HQ"));
    	main_tab->addTab(new unit_type_HQ(0, read_plist("units.src", "/home/dgdaniel/develop/Qt/dgd/src/", elite) ), tr("Elite"));
    	main_tab->addTab(new unit_type_HQ(0, read_plist("units.src", "/home/dgdaniel/develop/Qt/dgd/src/", sturm) ), tr("Sturm"));
    	main_tab->addTab(new unit_type_HQ(0, read_plist("units.src", "/home/dgdaniel/develop/Qt/dgd/src/", standard) ), tr("Standard"));
    	main_tab->addTab(new unit_type_HQ(0, read_plist("units.src", "/home/dgdaniel/develop/Qt/dgd/src/", approvement) ), tr("Unterstuetzung"));
    	main_tab->addTab(new unit_type_HQ(0, read_plist("units.src", "/home/dgdaniel/develop/Qt/dgd/src/", transport) ), tr("Transport"));
    	main_tab->setFixedSize(400, 475);
    
    	create_armee_list_layout();
    
    	mainLayout->addWidget(main_tab);
    	mainLayout->addLayout(armee_list_layout);
    }
    

    ich kann irgendwie nicht verstehen woher auf einmal die fehler kommen...
    eins würde mich zudem mal noch interessieren, als alles in einer datei stand musste ich noch eine moc datei mit dem selben dateinamen einbinden. muss ich das jetzt nicht mehr?



  • bei näherer betrachtung, denke ich das es wohl an etwas anderes liegen muss, bestimmt irgendwas mit den moc-dateien



  • Hast du in deiner Makefile auch die entsprechenden .cpp Dateien eingebunden? Und alle Memberfunktionen implementiert?


Anmelden zum Antworten