undefinierte referenz auf destruktor?! weiß nicht so ganz...
Verfasst: 21. April 2006 15:48
ich habe mein projekt endlich auf mehrere dateien verteilt, aber ich bekomme einen merkwürdigen fehler und weiß irgendwie keine lösung. da der fehler nur auf eine klasse eingeht poste ich mal den code. ich hoffe jemand könnte helfen.
FEHLER:
MAIN:
KLASSE: MyBoardWDG (MyBoardWDG.h)
IMPLEMENTATION
FEHLER:
Code: Alles auswählen
/home/daniel/qt/wh40k/src/main.cpp:20: undefined reference to `MyBoardWDG::MyBoardWDG(QWidget*)'
/home/daniel/qt/wh40k/src/main.cpp:25: undefined reference to `MyBoardWDG::~MyBoardWDG()'
/home/daniel/qt/wh40k/src/main.cpp:25: undefined reference to `MyBoardWDG::~MyBoardWDG()'
collect2: ld gab 1 als Ende-Status zurück
make: *** [../bin/wh40k] Fehler 1
Code: Alles auswählen
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <QtGui>
#include <iostream>
#include "txt_parse.hpp"
#include "menu_fkts.hpp"
#include "MyBoardWDG.h"
#include "Unit_Interface.h"
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();
}Code: Alles auswählen
#ifndef MYBOARDWIDGET_H
#define MYBOARDWIDGET_H
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <QtGui>
#include <iostream>
#include "txt_parse.hpp"
#include "menu_fkts.hpp"
extern const QString quell_pfad_units = "/home/daniel/qt/wh40k/bin/";
extern const QString quell_pfad_equip = "/home/daniel/qt/wh40k/bin/";
enum armee_bereich //für MyBoardWDG klasse
{
HQ,
Elite,
Standard,
Sturm,
Unterstuetzung
};
class MyBoardWDG : public QWidget
{
Q_OBJECT
private:
QFileDialog *s_filedial;
QFileDialog *o_filedial;
QPrinter *print_me;
QHBoxLayout *mainLayout;
QVBoxLayout *VBox_menu;
QMenuBar *filebar;
QMenu *file;
QMenu *data;
QMenu *help;
QTableWidgetItem *itm_u;
QTableWidgetItem *itm_e;
QTableWidgetItem *itm_p;
int row_sel;
QTabWidget *main_tab;
QTableWidget *armee_list;
QString unit_name;
public:
void create_QHBoxLayout_menu();
MyBoardWDG(QWidget *parent = 0);
virtual ~MyBoardWDG();
QVBoxLayout *armee_list_layout; //layout für tabelle, wird in den konstruktor eingebaut
void create_armee_list_layout();
void addToArmee(QString unit, QString equip, int price, armee_bereich area); //Daten in Tabelle schreiben
QStringList equip;
QStringList *foo_HQ;
QStringList *foo_EL;
QStringList *foo_ST;
QStringList *foo_SD;
QStringList *foo_AP;
QStringList *foo_TR;
int UPrice;
int *U_gPrice;
int *U_mPrice;
public slots:
//Menübar
void s_list();
void o_list();
void print_list();
void setUName(QString T);
void addToArmeeList_HQ();
void addToArmeeList_EL();
void addToArmeeList_ST();
void addToArmeeList_SD();
void addToArmeeList_AP();
void price_multiplier(int row, int column);
void setEquip_HQ();
void setEquip_EL();
void setEquip_ST();
void setEquip_SD();
void setEquip_AP();
void setmPrice(); //hat noch fehler
void delete_row();
void set_row(int row, int column);
};
#endif
Code: Alles auswählen
#include "MyBoardWDG.h"
MyBoardWDG::~MyBoardWDG()
{
}
void MyBoardWDG::setUName(QString T)
{
unit_name = T;
//UPrice = *U_gPrice;
//if(*U_mPrice < 50)
//UPrice = *U_gPrice + (*U_mPrice - *U_gPrice);
std::cout<<"String: "<< unit_name.toStdString() << " gespeichert."<<std::endl;
}
void MyBoardWDG::addToArmeeList_HQ()
{
QString Unit;
QString Equip_List;
int Price;
QString UName = unit_name;
Unit = UName.section("\t", 0, 0);
QStringList equipment = equip;
for(int i = 0; i < equipment.size(); i++)
{
Equip_List += (equipment.at(i) ).section("\t", 0, 0);
if(i < equipment.size() - 1)
Equip_List += ", ";
}
Price = UPrice;
std::cout<<"zur Liste hinzugefuegt."<<std::endl;
addToArmee(Unit, Equip_List, Price, HQ);
}
void MyBoardWDG::addToArmeeList_EL()
{
QString Unit;
QString Equip_List;
int Price;
QString UName = unit_name;
QStringList equipment = equip;
Unit = UName.section("\t", 0, 0);
for(int i = 0; i < equipment.size(); i++)
{
Equip_List += (equipment.at(i) ).section("\t", 0, 0);
if(i < equipment.size() - 1)
Equip_List += ", ";
}
Price = UPrice;
std::cout<<"zur Liste hinzugefuegt."<<std::endl;
addToArmee(Unit, Equip_List, Price, Elite);
}
void MyBoardWDG::addToArmeeList_ST()
{
QString Unit;
QString Equip_List;
int Price;
QString UName = unit_name;
QStringList equipment = equip;
Unit = UName.section("\t", 0, 0);
for(int i = 0; i < equipment.size(); i++)
{
Equip_List += (equipment.at(i) ).section("\t", 0, 0);
if(i < equipment.size() - 1)
Equip_List += ", ";
}
Price = UPrice;
std::cout<<"zur Liste hinzugefuegt."<<std::endl;
addToArmee(Unit, Equip_List, Price, Sturm);
}
void MyBoardWDG::addToArmeeList_SD()
{
QString Unit;
QString Equip_List;
int Price;
QString UName = unit_name;
QStringList equipment = equip;
Unit = UName.section("\t", 0, 0);
for(int i = 0; i < equipment.size(); i++)
{
Equip_List += (equipment.at(i) ).section("\t", 0, 0);
if(i < equipment.size() - 1)
Equip_List += ", ";
}
Price = UPrice;
std::cout<<"zur Liste hinzugefuegt."<<std::endl;
addToArmee(Unit, Equip_List, Price, Standard);
}
void MyBoardWDG::addToArmeeList_AP()
{
QString Unit;
QString Equip_List;
int Price;
QString UName = unit_name;
QStringList equipment = equip;
Unit = UName.section("\t", 0, 0);
for(int i = 0; i < equipment.size(); i++)
{
Equip_List += (equipment.at(i) ).section("\t", 0, 0);
if(i < equipment.size() - 1)
Equip_List += ", ";
}
Price = UPrice;
std::cout<<"zur Liste hinzugefuegt."<<std::endl;
addToArmee(Unit, Equip_List, Price, Unterstuetzung);
}
void MyBoardWDG::price_multiplier(int row, int column)
{
std::cout<<"Daten in Zelle: "<<row<<":"<<column<<" veraendert."<<std::endl;
row_sel = row;
int multi_kosten;
int einzel_preis;
int gruppenpreis;
if(column == 1)
{
std::cout<<"==>Berechne Preis neu."<<std::endl;
QTableWidgetItem *anzahl_item = new QTableWidgetItem();
anzahl_item = armee_list->item(row, column);
int anzahl = (anzahl_item->text() ).toInt(NULL, 10);
multi_kosten = anzahl * UPrice;
QString m_k;
QTableWidgetItem *multi_preis_item = new QTableWidgetItem();
multi_preis_item->setText(m_k.setNum(multi_kosten, 10) );
armee_list->setItem(row, 3, multi_preis_item);
}
}
void MyBoardWDG::setEquip_HQ() {equip = *foo_HQ;} //ganz gefährliches konstrukt!!!!
void MyBoardWDG::setEquip_EL() {equip = *foo_EL;}
void MyBoardWDG::setEquip_ST() {equip = *foo_ST;}
void MyBoardWDG::setEquip_SD() {equip = *foo_SD;}
void MyBoardWDG::setEquip_AP() {equip = *foo_AP;}
void MyBoardWDG::setmPrice() //hat noch fehler
{
UPrice = *U_mPrice;
std::cout<<"Gesamtpreis ist: "<<UPrice<<std::endl;
}
void MyBoardWDG::delete_row()
{
QTableWidgetItem *itm = new QTableWidgetItem();
itm->setText("");
std::cout<<"Loesche Zeile "<<row_sel<<std::endl;
armee_list->setItem(row_sel, 0, itm);
armee_list->setItem(row_sel, 1, itm);
armee_list->setItem(row_sel, 2, itm);
armee_list->setItem(row_sel, 3, itm);
}
void MyBoardWDG::set_row(int row, int column)
{
row_sel = row;
}
/*######################################################################################*/
void MyBoardWDG::s_list()
{
QString f_name;
f_name = s_filedial->getSaveFileName();
QDir dir = s_filedial->directory();
QString str_dir = dir.path();
save_data(str_dir, f_name, armee_list, 28, 4);
}
/*######################################################################################*/
void MyBoardWDG::o_list()
{
QString f_name;
f_name = o_filedial->getOpenFileName();
QDir dir = o_filedial->directory();
QString str_dir = dir.path();
open_data(str_dir, f_name, armee_list);
}
/*######################################################################################*/
void MyBoardWDG::print_list()
{
}
/*######################################################################################*/
MyBoardWDG::MyBoardWDG(QWidget *parent) : QWidget(parent)
{
VBox_menu = new QVBoxLayout(this);
filebar = new QMenuBar(this);
file = new QMenu(tr("&Datei"), filebar);
data = new QMenu(tr("&Bearbeiten"), filebar);
help = new QMenu(tr("&Hilfe"), filebar);
filebar->addMenu(file);
filebar->addMenu(data);
filebar->addMenu(help);
VBox_menu->addWidget(filebar);
create_QHBoxLayout_menu();
VBox_menu->addWidget(filebar);
VBox_menu->addLayout(mainLayout);
//Öffnen/Speichern
s_filedial = new QFileDialog(this);
s_filedial->setAcceptMode(QFileDialog::AcceptSave);
s_filedial->setFilter( "Text (*.wh40k)" );
file->addAction(tr("&Speichern"), this, SLOT(s_list() ) );
o_filedial = new QFileDialog(this, tr("Öffnen"));
o_filedial->setAcceptMode(QFileDialog::AcceptOpen);
o_filedial->setFilter( "Text (*.wh40k)" );
file->addAction(tr("&Öffnen"), this, SLOT(o_list() ) );
//drucken
print_me = new QPrinter(QPrinter::HighResolution);
print_me->setOrientation(QPrinter::Landscape);
print_me->setPageSize(QPrinter::A4);
print_me->setFullPage(true);
print_me->setNumCopies(1);
file->addAction(tr("&Drucken"), this, SLOT(print_list() ) );
}
/*######################################################################################*/
void MyBoardWDG::create_QHBoxLayout_menu()
{
mainLayout = new QHBoxLayout(this);
main_tab = new QTabWidget(this);
unit_interface *HQ = new unit_interface(0, read_plist("units.src", quell_pfad_units, hq));
main_tab->addTab(HQ, tr("HQ") );
QObject::connect(HQ->unit_name_combobox, SIGNAL(activated(QString) ), this, SLOT(setUName(QString) ));
QObject::connect(HQ->addUnit_But, SIGNAL(clicked() ), this, SLOT(addToArmeeList_HQ() ));
QObject::connect(HQ->unit_equipment_list, SIGNAL(itemSelectionChanged() ), this, SLOT(setEquip_HQ() ) );
QObject::connect(HQ->unit_equipment_list, SIGNAL(itemSelectionChanged() ), this, SLOT(setmPrice() ) );
foo_HQ = HQ->get_EquipList(); //foo_* übergeben...
U_mPrice = HQ->get_mPrice();
unit_interface *EL = new unit_interface(0, read_plist("units.src", quell_pfad_units, elite));
main_tab->addTab(EL, tr("Elite"));
QObject::connect(EL->unit_name_combobox, SIGNAL(activated(QString) ), this, SLOT(setUName(QString) ));
QObject::connect(EL->addUnit_But, SIGNAL(clicked() ), this, SLOT(addToArmeeList_EL() ));
QObject::connect(EL->unit_equipment_list, SIGNAL(itemSelectionChanged() ), this, SLOT(setEquip_EL() ) );
QObject::connect(EL->unit_equipment_list, SIGNAL(itemSelectionChanged() ), this, SLOT(setmPrice() ) );
foo_EL = EL->get_EquipList();
U_mPrice = HQ->get_mPrice();
unit_interface *ST = new unit_interface(0, read_plist("units.src", quell_pfad_units, sturm));
main_tab->addTab(ST, tr("Sturm"));
QObject::connect(ST->unit_name_combobox, SIGNAL(activated(QString) ), this, SLOT(setUName(QString) ));
QObject::connect(ST->addUnit_But, SIGNAL(clicked() ), this, SLOT(addToArmeeList_ST() ));
QObject::connect(ST->unit_equipment_list, SIGNAL(itemSelectionChanged() ), this, SLOT(setEquip_ST() ) );
QObject::connect(ST->unit_equipment_list, SIGNAL(itemSelectionChanged() ), this, SLOT(setmPrice() ) );
foo_ST = ST->get_EquipList();
U_mPrice = HQ->get_mPrice();
unit_interface *SD = new unit_interface(0, read_plist("units.src", quell_pfad_units, standard));
main_tab->addTab(SD, tr("Standard"));
QObject::connect(SD->unit_name_combobox, SIGNAL(activated(QString) ), this, SLOT(setUName(QString) ));
QObject::connect(SD->addUnit_But, SIGNAL(clicked() ), this, SLOT(addToArmeeList_SD() ));
QObject::connect(SD->unit_equipment_list, SIGNAL(itemSelectionChanged() ), this, SLOT(setEquip_SD() ) );
QObject::connect(SD->unit_equipment_list, SIGNAL(itemSelectionChanged() ), this, SLOT(setmPrice() ) );
foo_SD = SD->get_EquipList();
U_mPrice = HQ->get_mPrice();
unit_interface *AP = new unit_interface(0, read_plist("units.src", quell_pfad_units, approvement));
main_tab->addTab(AP, tr("Unterstuetzung"));
QObject::connect(AP->unit_name_combobox, SIGNAL(activated(QString) ), this, SLOT(setUName(QString) ));
QObject::connect(AP->addUnit_But, SIGNAL(clicked() ), this, SLOT(addToArmeeList_AP() ));
QObject::connect(AP->unit_equipment_list, SIGNAL(itemSelectionChanged() ), this, SLOT(setEquip_AP() ) );
QObject::connect(AP->unit_equipment_list, SIGNAL(itemSelectionChanged() ), this, SLOT(setmPrice() ) );
foo_AP = AP->get_EquipList();
U_mPrice = HQ->get_mPrice();
unit_interface *TR = new unit_interface(0, read_plist("units.src", quell_pfad_units, transport));
main_tab->addTab(TR, tr("Transport"));
main_tab->setFixedSize(400, 475);
create_armee_list_layout();
QObject::connect(armee_list, SIGNAL(cellChanged(int, int)), this, SLOT(price_multiplier(int, int)));
//aktuelle Zeile benutzen um einheiten in die armeeliste einzufügen (siehe addToArmee)
QObject::connect(armee_list, SIGNAL(cellClicked(int, int)), this, SLOT(set_row(int, int)));
mainLayout->addWidget(main_tab);
mainLayout->addLayout(armee_list_layout);
}
/*######################################################################################*/
void MyBoardWDG::create_armee_list_layout()
{
armee_list_layout = new QVBoxLayout();
armee_list = new QTableWidget(28, 4);
armee_list->setColumnWidth(0, 90);
armee_list->setColumnWidth(1, 30);
armee_list->setColumnWidth(2, 400);
armee_list->setColumnWidth(3, 50);
for(int i = 0; i < 28; i++) armee_list->setRowHeight(i, 18);
armee_list->setItem(0, 0, new QTableWidgetItem(tr("Typ:")));
armee_list->setItem(0, 1, new QTableWidgetItem(tr("A:")));
armee_list->setItem(0, 2, new QTableWidgetItem(tr("Ausruestung:")));
armee_list->setItem(0, 3, new QTableWidgetItem(tr("Punkte:")));
armee_list->setItem(1, 0, new QTableWidgetItem(tr("HQ:")));
armee_list->setItem(6, 0, new QTableWidgetItem(tr("Elite:")));
armee_list->setItem(11, 0, new QTableWidgetItem(tr("Standard:")));
armee_list->setItem(19, 0, new QTableWidgetItem(tr("Sturm:")));
armee_list->setItem(24, 0, new QTableWidgetItem(tr("Unterstuetzung:")));
QPushButton *del_Butt = new QPushButton("Lösche Zeile", this);
del_Butt->setFlat(true);
QObject::connect(del_Butt, SIGNAL(pressed() ), this, SLOT(delete_row() ) );
armee_list_layout->addWidget(armee_list);
armee_list_layout->addWidget(del_Butt);
}
/*######################################################################################*/
void MyBoardWDG::addToArmee(QString unit, QString equip, int price, armee_bereich area)
{
QString str_price = QString::number(price);
itm_u = new QTableWidgetItem(unit);
itm_e = new QTableWidgetItem(equip);
itm_p = new QTableWidgetItem(str_price);
std::cout<<"Markierte Zeile: "<<row_sel<<std::endl;
if(area == HQ && row_sel < 5)
{
armee_list->setItem(row_sel, 0, itm_u);
armee_list->setItem(row_sel, 2, itm_e);
armee_list->setItem(row_sel, 3, itm_p);
}
if(area == Elite && row_sel < 10 && row_sel >= 7)
{
armee_list->setItem(row_sel, 0, itm_u);
armee_list->setItem(row_sel, 2, itm_e);
armee_list->setItem(row_sel, 3, itm_p);
}
if(area == Standard && row_sel < 18 && row_sel >= 12)
{
armee_list->setItem(row_sel, 0, itm_u);
armee_list->setItem(row_sel, 2, itm_e);
armee_list->setItem(row_sel, 3, itm_p);
}
if(area == Sturm && row_sel < 23 && row_sel >= 20)
{
armee_list->setItem(row_sel, 0, itm_u);
armee_list->setItem(row_sel, 2, itm_e);
armee_list->setItem(row_sel, 3, itm_p);
}
if(area == Unterstuetzung && row_sel < 29 && row_sel >= 25)
{
armee_list->setItem(row_sel, 0, itm_u);
armee_list->setItem(row_sel, 2, itm_e);
armee_list->setItem(row_sel, 3, itm_p);
}
}
#include "MyBoardWDG.moc"