Superkonstruktor wie in Java
-
ich versteh zwar grad nicht was du meinst, aber hoffentlich versteht mich jemand und kann helfen
-
mir wird aus deinem Code in keinster weise klar in welchem zusammenhang die Klasse Ui_AlertWindow in deiner Main verwendet wird O_o kann sein das es da einen zusammenhang gibt den ich nicht erkenne, aber müsstest du nicht irgendwo irgendwie eine instanziierung tätigen bevor überhaupt die methode ok() aufgerufen werden kann ?
-
Erklär doch mal: Was ist die Klasse slot? Ist sie von irgendwas abgeleitet? Woher stammt die Variable Slot? Ist sie evtl eine Membervariable von Funktionen?
-
http://de.wikipedia.org/wiki/Signal-Slot-Konzept (Google)
scroll mal weiter runter @ braunstein, da sind sinnvollere codeschnipsel ich flieg auch grad mal drüberSry da blick ich jetzt so nicht durch XD vll. hilft der link irgendwie weiter ?!
-
es sieht so aus:
1. es beginnt alles in der main.cpp im main
2. dort erzeugt es das Objekt test
3. dan ruft es die Funktion displayGUI() auf
4. diese Funktion greift auf Funktionen der Datei ui_alert.h zu (in diesem schritt wird halt die grafische Benutzeroberfläche initialisiert)
5. nun führt es die restlichen Anweisungen aus der main aus
6. inzwischen wird die grafische Benutzeroberfläche schon angezeigt und diese wartet bis der User irgendetwas anklickt
7. sobald der User ein button anklickt wird das signal zum slot ok() geschickt
8. in der nun aufgerufenen Funktion ok() müsste die Funktion ausfuehren() aufgerufen werdenPunkt 1 bis 5 müssten klar sein
punkt 6 und 7 sind euch vielleicht bischen unklar. also ich benutze Qt falls es euch etwas sagt und da gibt es halt signals und slots. falls sich jemand dazu genauer interessiert: http://doc.trolltech.com/4.2/signalsandslots.html
und bei punkt 8 komm ich nicht weiterachja könnt ihr euch zwar bestimt denken, aber ich sags zur sicherheit trotzdem in main.cpp steht als include "#include "ui_alert.h"" unteranderem
-
Dann mal eine weitere Frage an dich.
Woher soll deine Klasse Ui_AlertWindow die Instanz test der Klasse Funktionen kennen? Du mußt doch diese Klasseninstanz irgendwie übergeben.
Wenn Funktionen nur eine Art Sammelbecken für Funktionen darstellen soll ersetze sie lieber durch einen Namespace oder mache deine Funktionen darin static. Dann kannst du sie auch ohne Objekt aufrufen.
-
KingV1k schrieb:
ich versteh zwar grad nicht was du meinst, aber hoffentlich versteht mich jemand und kann helfen
Also dazu könntest Du erheblich beitragen, indem Du selbst etwas exakter Dein Problem erklärst.
Bislang hat das jedenfalls weder mit "Super" noch mit "Konstruktor" noch mit "Java" zu tun. (womit vom Threadtitel lediglich "wie" und "in" übrigbleiben
)
... und dass Du in Deinem Eröffnungspost vonKingV1k schrieb:
... variablen und funktionen von der aufrufenden funktion zugreifen....
sprichst, macht es auch nicht deutlicher.
Mein Vorschlag, wenn Dein Problem in der Umsetzung von Java nach C++ liegt: Zeig uns doch Deine Implementation in Java (bzw. einen sinnvollen Ausschnitt davon) !
Dann helfen hier gerne viele weiter.Gruß,
Simon2.
-
mal abgesehen von der frage von braunstein die essenziell ist!!!!
ich finde nirgendwo das
QObject::connect(button, SIGNAL(EmitMethode()), window, SLOT(Ok()));
(ich geh hier mal von einer analogie in der verwendung zum beispiel in meinem link aus)
bei dir, wie verbindest du dann das signal des button mit der slot-methode ok() =?Dein Quellcode ist äusserst unvollständig, da sagt ein blick in die berühmte Glaskugel mehr (das war zwar zynisch aber nicht böse gemeint)
[EDIT]
Mein Vorschlag an dich wäre den Titel des Topic erstmal zu editieren und anzupassen (damit es nicht so offtopic wirkt) und dann nochmal einen detaillierteren Quellcode mit dem möglicht exakten Problem posten, sonst verheddern wir uns hier nur in unverständlichkeiten und eiern nur um deine eigentliche frage herum
-
da ich gestern schon seelisch komplett am ende war probier ich es jetzt nochmal von anfang.
also meine beiden Dateien main.cpp und ui_alert.h findet ihr unten. hätte jemand eine gute Idee wie ich den Titel dieses Topics nennen kann?main.cpp
#include <iostream> #include <fstream> #include <sys/stat.h> #include <time.h> #include <unistd.h> #include <string> #include <QApplication> #include "ui_alert.h" #include <QFile> #include <QFileInfo> #include <QDateTime> #include <QDir> #include <QString> using namespace std; class Funktionen { private: //hier stehen ein paar variablen public: Funktionen(); ~Funktionen(); void ausfuehren(); void displayGUI(); Ui::AlertWindow alert; }; int main(int argc, char *argv[]) { Funktionen test; QApplication app(argc, argv); test.displayGUI(); return app.exec(); test.~Funktionen(); } void Funktionen::displayGUI() //diese Methode sorgt dafür das das Fenster angezeigt wird { QMainWindow *window = new QMainWindow(); alert.setupUi(window); window->show(); } Funktionen::ausfuehren() { //Anweisungen } Funktionen::Funktionen() { //Anweisungen } Funktionen::~Funktionen() { //Anweisungen }
ui_alert.h
#ifndef UI_ALERT_H #define UI_ALERT_H #include <QtCore/QVariant> #include <QtGui/QAction> #include <QtGui/QApplication> #include <QtGui/QButtonGroup> #include <QtGui/QFrame> #include <QtGui/QLabel> #include <QtGui/QMainWindow> #include <QtGui/QPushButton> #include <QtGui/QWidget> #include <QObject> #include <string> #include <iostream> #include <fstream> using namespace std; class Ui_AlertWindow : public QObject { Q_OBJECT public slots: void ok() { /* hier muss die Funktion Funktionen::ausfuehren aufgerufen werden. keine ahnung wie ich das machen soll. das war meine Frage wie ich es machen soll ich habs mir so vorgestellt: super.ausfuehren(); aber das geht ja so nicht */ } public: QWidget *centralwidget; QPushButton *btnOk; QLabel *lblUeberschrift; void setupUi(QMainWindow *MainWindow) { MainWindow->setObjectName(QString::fromUtf8("MainWindow")); QApplication::setStyle("plastique"); QFont font; font.setFamily(QString::fromUtf8("Arial Black")); MainWindow->setFont(font); MainWindow->setCursor(QCursor(static_cast<Qt::CursorShape>(0))); centralwidget = new QWidget(MainWindow); centralwidget->setObjectName(QString::fromUtf8("centralwidget")); btnOk = new QPushButton(centralwidget); btnOk->setObjectName(QString::fromUtf8("btnOk")); btnOk->setGeometry(QRect(210, 70, 75, 41)); QFont font2; font2.setFamily(QString::fromUtf8("Arial Black")); btnOk->setFont(font2); lblUeberschrift = new QLabel(centralwidget); lblUeberschrift->setObjectName(QString::fromUtf8("lblUeberschrift")); lblUeberschrift->setGeometry(QRect(10, 20, 495, 21)); lblUeberschrift->setAlignment(Qt::AlignHCenter); QFont font4; font4.setFamily(QString::fromUtf8("Arial Black")); font4.setPointSize(8); lblUeberschrift->setFont(font4); MainWindow->setCentralWidget(centralwidget); retranslateUi(MainWindow); QSize size(516, 132); size = size.expandedTo(MainWindow->minimumSizeHint()); MainWindow->resize(size); MainWindow->setMinimumWidth(516); MainWindow->setMinimumHeight(132); MainWindow->setMaximumWidth(516); MainWindow->setMaximumHeight(132); QObject::connect(btnOk, SIGNAL(clicked()), this, SLOT(ok())); QObject::connect(btnOk, SIGNAL(clicked()), MainWindow, SLOT(close())); QMetaObject::connectSlotsByName(MainWindow); } // setupUi void retranslateUi(QMainWindow *MainWindow) { MainWindow->setWindowTitle(QApplication::translate("MainWindow", "Ueberschrift", 0, QApplication::UnicodeUTF8)); btnOk->setText(QApplication::translate("MainWindow", "OK", 0, QApplication::UnicodeUTF8)); lblUeberschrift->setText(QApplication::translate("MainWindow", "blabla", 0, QApplication::UnicodeUTF8)); Q_UNUSED(MainWindow); } // retranslateUi }; namespace Ui { class AlertWindow: public Ui_AlertWindow {}; } // namespace Ui #endif // UI_ALERT_H
-
also eine möglichkeit wär ja, wenn ich in der Klasse Ui_AlertWindow die Funktion bool isclicked(); erstelle und eine variable int clicked = 0; erstelle
bool isclicked(){ if(clicked==1){ return true; } else{ return false; } }
und außerdem die Funktion ok() überarbeite. ungefähr so:
void ok() { clicked = 1; }
dann kann ich in der main meiner main.cpp folgendes machen
int main(int argc, char *argv[]) { ......... .......... ....... ........ .......... ........... ........... .......... ........ ........... ......... while(alert.isclicked() == false){ //es soll so lange in der schleife bleiben, bis der button nicht geklickt wurde //damit es das system nicht in die knie zwingt kann ich noch eine verzögerung einbauen } //wenn der button endlich geklickt wurde geht er aus der schleife raus und führt die nächste anweisung aus test.ausfuehren(); }
aber das problem auf dieser art zu lösen finde ich zu unschön
-
Inwiefern hängen QMainWindow und Ui_AlertWindow zusammen?
Nochmal, du mußt deiner Fensterklasse (sei es nun QMainWindow oder Ui_AlertWindow) eine Instanz auf Funktionen übergeben (z.Bsp. im Konstruktor). Du hast in einer Funktion keinen Zugriff auf die aufrufende Funktion (Klasse). Das Konzept mit der Superklasse aus Java beinhaltet AFAIK ja auch etwas anderes. Da geht es ja wohl um Vererbungshierarchien.
Deine Fensterklassen erben aber nicht von Funktionen und kennen deshalb auch nicht dessen memberfunktionen.
Alsoclass Funktionen { // Konstruktor etc. void ausfuehren() {} }; class fenster { public: fenster(Funktionen* funct) : Functions(funct) {} public slots: void ok() { Functions->ausfuehren(); } private: Funktionen* Functions; // Rest };
-
ok. gut ich habe jetzt mein code dementsprechend verändert. aber ich bekomme jetzt compilerfehler:
ui_alert.h:58: error: ISO C++ forbids declaration ofFunktionen' with no type ui_alert.h:58: error: expected
;' before '*' token
ui_alert.h:61: error: expected)' before '*' token ui\_alert.h: In member function
void Ui_AlertWindow::ok()':
ui_alert.h:31: error: `Functions' undeclared (first use this function)
ui_alert.h:31: error: (Each undeclared identifier is reported only once for each function it appears in.)31: Functions->ausfuehren();
58: Funktionen* Functions;
61: Ui_AlertWindow(Funktionen* funct) : Functions(funct){}leigt der Fehler vielleicht darin das meine beiden Klassen sich in unterschiedlichen Dateien befinden?
-
Ja.
Du solltest den Header, wo Funktionen deklariert wurde mit einbinden.
-
ok ich hab oben ein #include "main.cpp" eingefügt.
die fehler von vorhin sind weg, aber jetzt sind noch viel mehr neue Fehler entstanden
mein Compiler sagt:
In file included from ui_alert.h:18,
from main.cpp:9:
main.cpp:68: error: using-declaration for non-member at class scope
main.cpp:68: error: expected;' before "alert" main.cpp: In member function
void Funktionen::getPath()':
main.cpp:160: error:alert' undeclared (first use this function) main.cpp:160: error: (Each undeclared identifier is reported only once for each function it appears in.) main.cpp: In member function
void Funktionen::date_of_ini()':
main.cpp:210: error:alert' undeclared (first use this function) main.cpp: In member function
void Funktionen::date_of_template()':
main.cpp:306: error:alert' undeclared (first use this function) main.cpp: In member function
void Funktionen::files_available()':
main.cpp:415: error:alert' undeclared (first use this function) main.cpp: In member function
void Funktionen::displayGUI()':
main.cpp:566: error:alert' undeclared (first use this function) main.cpp: In constructor
Funktionen::Funktionen()':
main.cpp:587: error:alert' undeclared (first use this function) In file included from main.cpp:9: ui\_alert.h: In member function
void Ui_AlertWindow::ok()':
ui_alert.h:32: error: 'class Funktionen' has no member named 'ausfuehren'
ui_alert.h: At global scope:
ui_alert.h:177: error: baseUi\_AlertWindow' with only non-default constructor in class without a constructor main.cpp:21: error: redefinition of
class Funktionen'
main.cpp:21: error: previous definition ofclass Funktionen' main.cpp: In function
int qMain(int, char**)':
main.cpp:73: error: redefinition ofint qMain(int, char**)' main.cpp:73: error:
int qMain(int, char**)' previously defined here
main.cpp: At global scope:
main.cpp:155: error: redefinition ofvoid Funktionen::getPath()' main.cpp:155: error:
void Funktionen::getPath()' previously defined here
main.cpp: In member functionvoid Funktionen::getPath()': main.cpp:160: error:
alert' undeclared (first use this function)
main.cpp: At global scope:
main.cpp:196: error: redefinition ofvoid Funktionen::date\_of\_ini()' main.cpp:196: error:
void Funktionen::date_of_ini()' previously defined here
main.cpp: In member functionvoid Funktionen::date\_of\_ini()': main.cpp:210: error:
alert' undeclared (first use this function)
main.cpp: At global scope:
main.cpp:292: error: redefinition ofvoid Funktionen::date\_of\_template()' main.cpp:292: error:
void Funktionen::date_of_template()' previously defined here
main.cpp: In member functionvoid Funktionen::date\_of\_template()': main.cpp:306: error:
alert' undeclared (first use this function)
main.cpp: At global scope:
main.cpp:396: error: redefinition ofvoid Funktionen::files_available()' main.cpp:396: error:
void Funktionen::files_available()' previously defined here
main.cpp: In member functionvoid Funktionen::files_available()': main.cpp:415: error:
alert' undeclared (first use this function)
main.cpp: At global scope:
main.cpp:425: error: redefinition ofvoid Funktionen::getServerName\_and\_IP()' main.cpp:425: error:
void Funktionen::getServerName_and_IP()' previously defined here
main.cpp:501: error: redefinition ofvoid Funktionen::showServerName()' main.cpp:501: error:
void Funktionen::showServerName()' previously defined here
main.cpp:515: error: redefinition ofvoid Funktionen::get\_Path\_of_App()' main.cpp:515: error:
void Funktionen::get_Path_of_App()' previously defined here
main.cpp:528: error: redefinition ofvoid Funktionen::unrar()' main.cpp:528: error:
void Funktionen::unrar()' previously defined here
main.cpp:557: error: redefinition ofvoid Funktionen::setArray()' main.cpp:557: error:
void Funktionen::setArray()' previously defined here
main.cpp:565: error: redefinition ofvoid Funktionen::displayGUI()' main.cpp:565: error:
void Funktionen::displayGUI()' previously defined here
main.cpp: In member functionvoid Funktionen::displayGUI()': main.cpp:566: error:
alert' undeclared (first use this function)
main.cpp: At global scope:
main.cpp:585: error: redefinition ofFunktionen::Funktionen()' main.cpp:585: error:
Funktionen::Funktionen()' previously defined here
main.cpp: In constructorFunktionen::Funktionen()': main.cpp:587: error:
alert' undeclared (first use this function)
main.cpp: At global scope:
main.cpp:593: error: redefinition ofFunktionen::~Funktionen()' main.cpp:593: error:
Funktionen::~Funktionen()' previously defined herealso wie ich sehe kann ich es vergessen.oder was soll ich machen?
-
Neeeiiiin!
Du sollst keine cpp und schon garnicht die main.cpp inkludieren. Lagere die Deklaration der Klasse Funktionen in eine Headerdatei aus und inkludiere die.
Ich habe das Gefühl, du solltest dir nochmal ein Tutorial zu diesen Themen durchlesen bevor du mit QT weitermachen willst. Ist jetzt nicht böse gemeint.
-
ok. da hast du wohl recht. kennst du vielleicht ein gutes tutorial dazu. ich hab grad eben bischen gegooglet, aber nichts tolles gefunden.
-
z.Bsp. das hier
http://tutorial.schornboeck.net
für dieses Thema genauer das hier
http://tutorial.schornboeck.net/uebersetzungseinheiten.htm
-
ok. habs ich jetzt gemacht. der compiler sagtt jetzt folgendes:
In file included from ui_alert.h:18,
from main.cpp:9:
funktionen.h:39: error: using-declaration for non-member at class scope
funktionen.h:39: error: expected;' before "alert" In file included from main.cpp:9: ui\_alert.h:172: error: base
Ui_AlertWindow' with only non-default constructor in class without a constructor
mingw32-make: *** [release\main.o] Error 139: Ui::AlertWindow alert;
172: class AlertWindow: public Ui_AlertWindow {};kann mir das jemand erklären? oder sagen was ich tun soll?
-
39
funktionen.h scheint Ui::AlertWindow nicht zu kennen. Mach diese Klasse bekannt. Was ist denn Ui, ein namespace?
172class AlertWindow: public Ui_AlertWindow {};
Hier deklarierst du die Klasse AlertWindow abgeleitet von Ui_AlertWindow ohne einen neuen Konstruktor zu deklarieren. Der Compiler versucht dann den default-Konstruktor zu erzeugen. Dieser muß den default-Konstruktor der Basisklasse Ui_AlertWindow aufrufen. Diese hat aber keinen, da dort ein nicht-default-Konstruktor existiert.
Entweder du spendierst der Basisklasse einen Default-Konstruktor (ohne Argumente) oder du deklarierst in AlertWindow einen eigenen Konstruktor welcher den Konstruktor der Basisklasse aufruft.