WinFuture-Forum.de: Oop-programmierung Auch Bei Guis? (c++) - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Oop-programmierung Auch Bei Guis? (c++) v.a. bzgl. Callbacks


#1 Mitglied ist offline   du ciel 

  • Gruppe: aktive Mitglieder
  • Beiträge: 148
  • Beigetreten: 03. Dezember 04
  • Reputation: 0

  geschrieben 12. Dezember 2007 - 17:55

Hallo,

ich wollt mal fragen wie ihr eigentlich Guis in C++ programmiert: schmeißt ihr die Gui-Elemente in die main-function und diese in eine Klasse? oder nur die Callbacks, also die Funktionen für die jeweiligen Buttons oder überhaupt nichts vom Gui - also nur die reine logik?

Erstellt man für jeden Callback eine neue Klasse oder geht das irgendwie kompakter?

Ich hab das Problem, dass ich schon ewig herumrudere was Guis betrifft besonders in Bezug auf Button-Callbacks u.Ä. und bisher nirgends etwas gefunden habe was mir mal klar und deutlich sagt: "So geht man bei Guis vor."

In Java kann man die callbacks ja einfach mit dem MouseListener in die main-function schreiben, doch in C++ geht das nicht ... oder nehm ich die falsche Library? (FLTK)


Hier gibts doch sicherlich Informatiker die das von grundauf gelernt haben, vielleicht auch welche die es sich selbst beibrachten und am selben Problem standen wie ich gerade.



Grüße,
du ciel

Dieser Beitrag wurde von du ciel bearbeitet: 12. Dezember 2007 - 18:15

0

Anzeige



#2 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 12. Dezember 2007 - 19:34

Alles ordentlich kapseln.

Egal, ob es Webanwendungen oder Desktop-Applikationen sind, sollte man sie immer nach dem gleichen Prinzip erstellen: Trenne deine GUI von deiner Geschäftslogik (und diese von der Persistenz- bzw Datenhaltungsschicht).

Sie muss so aufgebaut werden, dass du jeder Zeit zig verschiedene GUIs drauf setzen kannst. Deine Geschäftslogik, deine Implementierung, deine Algorithmen dürfen nichts von einer GUI wissen. Sie bieten nur Schnittstellen nach außen. Ein konkretes Beispiel kann ich dir eine Schicht drunter geben: Einer MySQL-Datenbank ist es egal, ob sie über Java, PHP oder C++ angesprochen wird. Sie bietet nur ihre Schnittstellen nach außen.
0

#3 Mitglied ist offline   du ciel 

  • Gruppe: aktive Mitglieder
  • Beiträge: 148
  • Beigetreten: 03. Dezember 04
  • Reputation: 0

geschrieben 12. Dezember 2007 - 20:46

Danke erstmal,

ich programmiere derzeit eine GUI für ein Konsolenprogramm, welches bereits so ausgelegt wurde, die Trennung von Logik und zukünftigem Gui ist also schon vorhanden.


Problem bei mir ist, dass ich nicht weiß wie ich es konkret implementiere. Alle Beispiele sind nur so kurz, dass Klassen keine Verwendung finden. Das Gui ist im Prinzip schon fertig und funktioniert, ich habe einfach alles lose in eine *.cpp geschrieben wie in jedem besseren Tutorial beschrieben, doch momentan lernen wir OOP mit Java und ich möchte die Vorteile gern auch auf C++ anwenden, leider hat bei uns keiner Ahnung von C++ :blink:

Beispiel:
Die main-Funktion ruft meine Klasse "Gui" auf in der alle Methoden für MainFrame und Buttons enthalten sind. Nun kann ich aber nicht von einer Methode eine andere in der selben Klasse aufrufen, da meckert er rum.

Ich zeig mal ein Stück Code:

class Gui { 
  protected: 
	void CB_button_about_close(Fl_Widget*, void*); 
	void CB_button_about(Fl_Widget*, void*); 

  public: 
	Fl_Button *button_about_close; 
}; 

void Gui::CB_button_about_close(Fl_Widget*, void*) { 
  win_about->hide(); 
  delete(win_about); 
} 

// anderer Callback des Buttons "about" 
void Gui::CB_button_about(Fl_Widget*, void*) { 
  ... 
  button_about_close = new Fl_Button(0, 80, 400, 20, "close"); 
  button_about_close->box(FL_THIN_DOWN_BOX); 
  button_about_close->callback(CB_button_about_close); 
  ... 
}


Problem ist die letzte Codezeile, der Aufruf "CB_button_about_close" funktioniert nicht. Er meckert:

error: no matching function for call to `Fl_Button::callback(<unknown type>, Gui* const)'

Dieser Code funktioniert einwandfrei wenn ich Klassen und was die OOP noch so bietet, weglasse ...


Ist denn eigentlich die Vorgehensweise bei allen C++-Gui-Libs dieselbe?



du ciel

Dieser Beitrag wurde von du ciel bearbeitet: 12. Dezember 2007 - 20:51

0

#4 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 12. Dezember 2007 - 20:52

Da muss ich passen. Das hat an sich jetzt nichts mit OOP zu tun, sondern mit dem GUI-Framework, das du nutzt.

Da ich mit diesem Teil keine Erfahrung habe, kann ich dir leider nur die Dokumentation des Frameworks oder eine Google-Suche nach der Fehlermeldung empfehlen.
Vielleicht gibt ja auch noch andere hier, die das Teil kennen. :blink:

Edit:
Übrigens soll QT sehr beliebt bei C++ Entwicklern sein. Kannst es dir ja mal anschauen: http://doc.trolltech...3/tutorial.html
0

#5 Mitglied ist offline   du ciel 

  • Gruppe: aktive Mitglieder
  • Beiträge: 148
  • Beigetreten: 03. Dezember 04
  • Reputation: 0

geschrieben 12. Dezember 2007 - 21:07

... d.h. theoretisch sollte in C++ ein Aufruf einer Funktion innerhalb der selben Klasse funktionieren?


nuja, ich hatte mich extra für FLTK entschieden weil es einfach sein soll, aber viele nutzen das leider nicht ... QT ist gut, aber recht teuer wenn man später vielleicht mal kommerzielle Software entwickelt.


Was nutzt du für eine Lib in C++?
0

#6 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 13. Dezember 2007 - 07:59

Zitat

theoretisch sollte in C++ ein Aufruf einer Funktion innerhalb der selben Klasse funktionieren

[klugscheiß]Klassen haben keine Funktionen, sondern Methoden[/klugscheiß]

Nicht nur theoretisch. Natürlich geht das, alles andere wäre mit einem Tod der jeweiligen Sprache gleichzusetzen.
Bei C++ machst du das in der Regel über den this-Zeiger:
void foo {...}
void bar { this->foo(); }


Zitat

Was nutzt du für eine Lib in C++?

Keine, weil ich nicht in C++ entwickle. :angry:
0

#7 _Fenix_

  • Gruppe: Gäste

geschrieben 13. Dezember 2007 - 16:51

Du könntest alternativ auch GTKmm verwenden http://www.gtkmm.org/ oder wxWidgets http://www.wxwidgets.org (beide sehr gut dokumentiert + plattformunabhängig).
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0