Komplilerfehler bei Dev C++ und Qt


  • Mod

    Beschäftige dich doch erstmal mit den Grundlagen der OOP und von C++.

    Das Fenster solltest du am besten als Pointer übergeben, damit du es später nicht zurückgeben musst, was sowieso blödsinn ist, da du ja nur das Fenster verändern willst, es aber nicht erzeugst.



  • Und wie genau mach ich das? (codebeispiel wäre nicht schlecht)

    Was verstehtste denn genau unter grundlagen? in meinen Augen versuch ich grad genau das. Für konsolenanwendungen benutz ich mein C und genau wegen dem GUI sachen bin ich ja zum C++ gekommen und dotnet hat sich leider als verdammt lahm und ausserordentlich inkompatibel zu meinen bissherigen projekten rausgestellt.


  • Mod

    Versuch erstmal auf der Console C++ und OOP umzusetzen. Du brauchst dafür keine großen und komplizierten Frameworks wie QT.
    Später kannst du dann immer noch darauf aufbauen. Ein Anfang wäre sicherlich auch das C++ Magazin hier, da hat es einige gute Artikel.

    Und die Grundlagen für den Einstieg, ist dieses hier ganz gut:
    http://tutorial.schornboeck.net/



  • Für die konsolenprogrammierung kenn ich mich mit C gut genug aus, dafür brauch ich kein C++. ausserdem wüsste ich auch nicht was ich damit sinnvolles machen könnte.
    Zwei C++ bücher hab ich abgesehen davon schon hinter mir, ändert aber nichts daran das ich mich momentan mit oben genannten problem rumschlage. Da ist der Komentar das ich zuerst was anderes machen soll nicht grade hilfreich.
    Ich setz mich mit C++ auseinander weil ich eine benutzeroberfläche für ein existierendes Programm schreiben möchte, ohne benutzeroberfläche auch kein C++, warum soll ich mir die mühe machen für etwas das ich nicht gebrauchen kann.

    Also bitte ne direkte hilfe mit der exakten Problembehandlung wie es die vorherigen post auch gemacht haben, alles andere hilft mir nicht weiter, vor allen nicht den ganzen tag etwas zu lesen um dann festzustellen das es mich auch nicht weiterbringt. meist hängen so sachen einfach an kleinigkeiten wo man sich einfach festgefahren hat oder was auch immer und dann hilft auch nur ein schubs in die richtige richtung.


  • Mod

    Wenn du C so gut kannst, solltest du auch wissen was ein Pointer ist, und wie man ihn an eine Funktion/Methode übergibt.

    void foo::bar(myWidget* widget)
    {
      //tu was mit widget
    }
    

    phlox



  • Was ich in C kann reicht zumindest um das zu programmieren was ich eben damit programmiern will.

    phlox81 schrieb:

    void foo::bar(myWidget* widget)
    {
      //tu was mit widget
    }
    

    phlox

    Was genau soll ich damit anfangen? Ich weiß jetzt weder wo vorher mein Problem lag noch was ich mit dem Snipsel anfangen soll. Also bitte ne klare antwort die sich auf meinen Code bezieht damit ich genau nachvollziehen kann wo denn überhaupt das generelle Problem liegt. In allen büchern/tutorials steht das klassen so oder so ähnlich übergeben werrden wie ichs getan hab, ich hab dabei alle Kombinationen gestestet und keine hat das erwünschte resultat gebracht.
    Was also soll ich tun? Es komplett seinlassen oder um hilfe bitten und genau das tue ich hier und wenn ich das nicht generell falsch verstanden hab ist diese forum unter anderem genau dafür da. Also bitte wirf mir nich noch Steine in den Weg. Ich brauch ne klare und konkrete Antwort was denn nun genau der fehler ist, Autofahren lernt man auch nicht nur in den theoriestunden und ich häng auch nicht in der theorie sondern akut an der praksis.


  • Mod

    seelenquell schrieb:

    Was genau soll ich damit anfangen? Ich weiß jetzt weder wo vorher mein Problem lag noch was ich mit dem Snipsel anfangen soll. Also bitte ne klare antwort die sich auf meinen Code bezieht damit ich genau nachvollziehen kann wo denn überhaupt das generelle Problem liegt. In allen büchern/tutorials steht das klassen so oder so ähnlich übergeben werrden wie ichs getan hab, ich hab dabei alle Kombinationen gestestet und keine hat das erwünschte resultat gebracht.
    Was also soll ich tun? Es komplett seinlassen oder um hilfe bitten und genau das tue ich hier und wenn ich das nicht generell falsch verstanden hab ist diese forum unter anderem genau dafür da. Also bitte wirf mir nich noch Steine in den Weg. Ich brauch ne klare und konkrete Antwort was denn nun genau der fehler ist, Autofahren lernt man auch nicht nur in den theoriestunden und ich häng auch nicht in der theorie sondern akut an der praksis.

    Nun ja ich ging davon aus, das du aus C ja bereits Pointer kennen müsstest, und ebenfalls schon Funktionen verwendet hast.
    Dein Problem hier hat mit OOP erstmal nichts zu tun, du erstellst lediglich einige Objekte, und müsstest sie entsprechend an deine Methoden übergeben, und das macht man in C/C++ nun mal mit Pointern oder Referenzen.

    Und wenn sie so übergeben würden, müsste es ja kompilieren. Aber wie du schon selber festgestellt hast, tut es das nicht. Also muss es doch anders sein...
    Und eine Klasse kannst du nicht übergeben, zur Laufzeit existieren nur Objekte von Klassen, diese Instanzen kannst du dann übergeben etc.

    void newButton::fnewButton(mywidget* foo)
    

    Denke auf den Rest solltest du von alleine kommen.
    Du musst lediglich beim Aufruf der Methode den Pointer übergeben, welchen du ja schon in der GUI Methode hast.

    phlox



  • Nein, ehrlichgesagt versthe ich nicht was du von mir willst. Meiner meinung nach mach ich genau das, ich übergeb einen zeiger.
    Sag mir doch einfach was genau an meinem code geändert werden muss anstatt mir ständig neue codes um die ohren zu hauen mit denen ich nichts anzufangen weiß. wo kommt das foo auf einmal her? klar das er mir immer weitere fehlermeldungen auspuckt wenn ich versuch sowas einzubauen. natürlich weiß ich was nen zeiger ist und genau den versuch ich ja auch zu übergeben, aber ich weiß nicht wo im code denn genau das problem ist und was genau das problem ist.


  • Mod

    seelenquell schrieb:

    MyFunc.cpp

    #include "MyFunc1.h"
    
    QWidget newButton::fnewButton(QWidget MyWidget){
        myButton = new QPushButton(MyWidget);
        connect(myButton, SIGNAL(clicked()),this, SIGNAL(buttonClicked()));
        myButton->setGeometry(10, 50, 120, 30);
        myButton->setText("test54321");
    	return(MyWidget);
    }
    

    Folgende Fehlermeldungen werden dazu ausgespuckt:

    4 C:\bloodsheed\sim2\main.cpp In file included from main.cpp 
     C:\bloodsheed\sim2\gui.h In function `void gui_main()': 
    18 C:\bloodsheed\sim2\gui.h no matching function for call to `newButton::fnewButton(QWidget&)' 
     note C:\bloodsheed\sim2\MyFunc1.h:12 candidates are: QWidget newButton::fnewButton(QWidget (*)()) 
     note C:\bloodsheed\sim2\MyFunc1.h:12 candidates are: QWidget newButton::fnewButton(QWidget (*)())
    

    Die Fehlermeldungen beziehen sich dabei auf folgende Zeile:

    MyWidget=vnewButton->fnewButton(*MyWidget);
    

    Is mir ehrlich gesagt Zimlich rätzelhaft obwohl so im Buch steht.

    Du müsstest in fnewbutton einen Zeiger übergeben. So ist es eine normale Variable, die per copysemantic in die Funktion kommt.
    D.h. es wird eine neue Instanz für die Klasse gebildet, eine kopie. Das darf aber nicht sein, weil es ja nur ein Fenster geben soll.
    Ergo musst du die Variable von QWidget, mywidget, als Referenz oder Pointer übergeben.

    void newButton::fnewButton(QWidget* MyWidget)
    

    foo diente mir nur als Platzhalter.



  • Gut, wenn ich statt:

    MyWidget=vnewButton->fnewButton(*MyWidget);
    
    vnewButton->fnewButton(MyWidget);
    

    schreibe und

    QWidget newButton::fnewButton(QWidget* MyWidget)
    

    in

    void newButton::fnewButton(QWidget* MyWidget)
    

    ändere gehts wenn ich das return und die definition rausnehme. Wäre nett gewesen das auch so zu schreiben.

    Aber wenn ich mit absicht eine Kopie erstellen will (muss ja nicht zwingend nen widget sein), wie müssten dann die folgenden zeilen aussehen?

    MyWidget=vnewButton->fnewButton(*MyWidget);
    
    QWidget newButton::fnewButton(QWidget* MyWidget)
    
    return(MyWidget);
    

  • Mod

    seelenquell schrieb:

    Gut, wenn ich statt:

    MyWidget=vnewButton->fnewButton(*MyWidget);
    
    vnewButton->fnewButton(MyWidget);
    

    schreibe und

    QWidget newButton::fnewButton(QWidget* MyWidget)
    

    in

    void newButton::fnewButton(QWidget* MyWidget)
    

    ändere gehts wenn ich das return und die definition rausnehme. Wäre nett gewesen das auch so zu schreiben.

    Normalerweise bin ich es gewohnt, das die Leute mitdenken...
    Und GUI ist für C++ Anfänger eigentlich nichts. Deshalb auch mein Rat zur Konsole, schau dir das OOP Konzept erstmal an, bevor du gleich mit einer komplexen Library rumspielst, und dich wunderst, wieso andauernd etwas nicht klappt.

    seelenquell schrieb:

    Aber wenn ich mit absicht eine Kopie erstellen will (muss ja nicht zwingend nen widget sein), wie müssten dann die folgenden zeilen aussehen?

    MyWidget=vnewButton->fnewButton(*MyWidget);
    
    QWidget newButton::fnewButton(QWidget* MyWidget)
    
    return(MyWidget);
    
    typedef QWidget foo;
    foo newButton::copyfoo(foo myvarname)
    {
    // myvarname in der Methode bearbeiten etc.
      return myvarname;
    }
    

    Problem hier bei, du erzeugst überflüssige Kopien, was nicht wirklich performant ist.
    Wenn es eine eigene Klasse ist, brauchst du auch noch einen CopyConstructor, damit du eine tiefe Kopie der Klasse anfertigen kannst.

    phlox



  • phlox81 schrieb:

    Normalerweise bin ich es gewohnt, das die Leute mitdenken...
    Und GUI ist für C++ Anfänger eigentlich nichts. Deshalb auch mein Rat zur Konsole, schau dir das OOP Konzept erstmal an, bevor du gleich mit einer komplexen Library rumspielst, und dich wunderst, wieso andauernd etwas nicht klappt.

    Der Umgangen mit der Qt Bibliothek is lang nicht mein erster versuch in der OOP, die meisten sachen hab ich auch durchaus schon mehrmals durchgekaut, problem ist blos immer das es immer die selben ecken und kanten sind an denen ich hängen bleib. Dabei hilft es verflucht wenig wenn man immer den verweiß kriegt doch erstmal nen buch darüber zu lesen was generell auch nur hilft wenn man überhaupt keine ahnung hat, ansonsten aber meist zeitverschwendung das es bei den meisten leuten nur kleinigkeiten sind an denen es hängt und die in den wenigsten büchern so behandelt werden wie das problem auftritt. jemanden der nen platten reifen hat empfehl ich auch nicht erstmal ne lehre als KFZ mechaniker zu machen und es hätte uns beiden einiges an zeit gespart wenn du gleich ne richtige antwort gegeben hättest. Es ist einfach keine hilfe jemanden nur auf ein Buch zu verweisen, ihn aber sonst im regen stehen zu lassen.

    typedef QWidget foo;
    foo newButton::copyfoo(foo myvarname)
    {
    // myvarname in der Methode bearbeiten etc.
      return myvarname;
    

    Is mir föllig uverständlich was das typedef darin soll, hast du den neuen namen nur desswegen vergeben damit der code schwerer zu lesen ist?

    QWidget newButton::copyfoo(QWidget myvarname)
    {
    // myvarname in der Methode bearbeiten etc.
      return myvarname;
    

    ist wesentlich einfacher zu lesen.

    phlox81 schrieb:

    Problem hier bei, du erzeugst überflüssige Kopien, was nicht wirklich performant ist.
    Wenn es eine eigene Klasse ist, brauchst du auch noch einen CopyConstructor, damit du eine tiefe Kopie der Klasse anfertigen kannst.
    phlox

    Das es in dem fall sinnvoller ist Kopien zu vermeiden leuchtet mir auch ein, aber es kann ja sein das ich nen button oder nen label mit gleichen atributen nochmal an anderer stelle abbilden will oder mit einem datensatz arbeiten will ohne das ich alles nochmal neu erstellen will.


Anmelden zum Antworten