Visual C++ als Java Programmierer
-
Stimmt, Du hast Recht! <map> geht! Werd mir das dann mal genauer anschauen!
-
Ja, das man in einem neuen und bestehenden Projekt überfordert ist, geht jedem so. Aber man kann sich einarbeiten! Ich sehe das nur so, das dir die Basics fehlen. Z.B. warum brauche ich einen Header? Wie arbeitet der Compiler und Linker? Diese ganzen Sachen gibt es in Java nicht. OOP ist nur eine Fasette am C++. Deshalb ist es schon mal gut, das du das Breymann-Buch bestellt hast. Du solltest auch nicht die ersten Kapitel überspringen (ok, die OO-Einführung, was ne Klasse ist, vielleicht schon
). Weil am Anfang schon erklärt wird, wie man einen Compiler bedient. Die IDE versteckt viele C++-Konzepte (die man als Erfahrener auch nicht sehen muß). Aber ein Linker-Fehler ist z.B. kein Compile-Fehler. Wenn man das nicht sieht (Fehlermeldung genau lesen!) und nicht versteht, wird man den Fehler an der falschen Stelle suchen.
-
Die Devise ist wahrscheinlich wie immer: Immer weitermachen und nie aufgeben, was?
Aber stimmt, ich verstehe zuviele C++ Konstrukte nicht, Beispiel:
CGraph::CGraph(HWND hWnd) : CAxDialogImpl<CGraph, CAxWindow>(), m_ParenthWnd(hWnd) { }
Wenn ich mir das anschaue, denke ich folgendes: Es ist ein Konstruktor für die Klasse CGraph mit dem Parameter HWND hWnd.
Gedanke: Warum wird diese HWND groß geschrieben? Und h stand für handle, WND wahrscheinlich für Window? Also bekomme ich über den Parameter nen handle zum Window?
Danach kommt ein Doppelpunkt. Kenn ich aus Java nicht, aber ich habe gelesen, dass dies gleich die Zuweisung ist. Aber das in den eckigen Klammern krieg ich nicht so zugeordnet. Würde denken, dass ist ne Typdefinition, damit man weiss was reinkommt? Was auch verwirrend ist, ist das Komma und danach die Membervariable (und dazu hat ne Membervariable noch nen Parameter?!). Warum?Solche Zeilen gibt es in Programmen natürlich wie Sand am Meer. Nur wenn man dann zu einem Arbeitskollegen geht und nachfragt und der sagt, er hat auch keine Ahnung. Wie soll man das dann verstehen? Da bleibt mir ja nur übrig zu sagen, dass ich jetzt erstmal nur 3 Monate Grundlagen mache, weils so keinen Sinn hat.
Obwohl ich gerade merke, dass ich jetzt von der Zeile oben schon mehr verstanden habe als vor dem Posting
-
Die Zeile ist ganz normaler C++ Code. Steht alles im Breyman erklärt. OK, nicht HWND wird erklärt, aber z.B. was der einzeln stehende Doppelpunkt da zu suchen hat (hat was mit Vererbung zu tun, ist vergleichbar mit extend aus Java!!! Also eigentlich ganz einfach). usw. usf.
Du weißt praktisch nichts über C++.
Du mußt wirklich bei null anfangen. Aber vieles wirst du sofort verstehen, weil die Syntax nur anders ist. Aber es gibt auch vieles in C++, was es in Java nicht gibt. Also wirst du auch mehr lernen, was ja auch Spaß macht.
-
Mal in Java (in etwa, lässt sich nicht wirklich in Java abbilden):
public class CGraph extends CAxDialogImpl { CGraph(HWND hWnd) { super.CAxDialogImpl(); m_ParenthWnd = hwnd; } }
naja, so in etwa... WTL ist ein wenig crazy, wenn man keine Templates in Java abbilden kann.
-
Klar den Doppelpunkt bei C+ kenn ich wohl, aber nur bei Klassen! Im C++ Code war doch aber nur der Konstruktor dargestellt? Na auf jeden Fall freu ich mich auf das Buch, was ich gleich zuhause liegen haben sollte ;). Dann kommt vielleicht mal Licht ins Dunkel. Ich wusste ja schon vorher dass ich hier auch viel mit C++ zu tun haben werde, wollte diese Sprache auch noch unbedingt gerne lernen, da ich denke, dass es einfach zu einem guten Programmierer dazugehört.
Bis zur nächsten dummen Frage von mir
-
Ich hatte mal ein MFC6-Projekt nach MFC7.1 migriert.
Wir haben so ca. 200 Projekte von MFC6 nach MFC 8 migriert. Wie Archi schon schreibt, die Änderungen sind überschaubar. Bei uns waren es vor allem nicht Ansi-konforme for-Schleifen, implizite Casts und einige Projekteigenschaften. Allerdings haben wir bisher nicht auf Unicode umgestellt, weil Zeit und Bedarf fehlen.
Du hast dann wirklich bessere Möglichkeiten.
Aber wenn dein Chef sich quer stellt?
-
Ich habe nun ein Problem mit der map (wär hätte das gedacht).
#include <map> funktioniert. Daher bekomme ich auch keinen Fehler in der Quellcodedatei, wenn ich schreibe:map<string, string> mapDaten;
Allerdings bekomme ich 210 Warnungen, die insgesamt über 100 Seiten lang sind. D.h. der Start des Programms verzögert sich schon allein deswegen um 10 Sekunden.
Was ist an der Zeile verkehrt? Hier einfach einen kleinen Ausschnitt aus den Warnungen:
d:\msstudio\vc98\include\xtree(77) : warning C4786: '??Econst_iterator@?basic_string@DU?allocator@D@2@@std@@U?basic_string@DU?allocator@D@2@@std@@V12@@2@U_Kfn@?basic_string
@DU?allocator@D@2@@std@@V12@U?basic_string@DU?allocator@D@2@@std@@@2@V?basic_string@DU?allocator@D@2@@std@@@2@@2@U?basic_string@DU?allocator@D@2@@std@@@2@V?basic_string@DU?allocator@D@2@@std@@@2@@std@@QAEAAV012@XZ' : Bezeichner wurde auf '255' Zeichen in den Browser-Informationen reduziert
d:\msstudio\vc98\include\map(46) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::_Tree<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::pair<class std::basic_string<
char,struct std::char_traits<char>,class std::allocator<char> > const ,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,struct std::map<class std::basic_string<char,struct std::char_traits<char>,class std::al
locator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<class std::basic_
string<char,struct std::char_traits<char>,class std::allocator<char> > > >::_Kfn,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<class std::basic_string<char,struct std:
:char_traits<char>,class std::allocator<char> > > >'
E:\Test\dw\DW.CPP(5) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<ch
ar>,class std::allocator<char> >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >
> >'
d:\msstudio\vc98\include\xtree(81) : warning C4786: '??Econst_iterator@?basic_string@DU?allocator@D@2@@std@@U?basic_string@DU?allocator@D@2@@std@@V12@@2@U_Kfn@?basic_string
@DU?allocator@D@2@@std@@V12@U?basic_string@DU?allocator@D@2@@std@@@2@V?basic_string@DU?allocator@D@2@@std@@@2@@2@U?basic_string@DU?allocator@D@2@@std@@@2@V?basic_string@DU?allocator@D@2@@std@@@2@@std@@QAE?AV012@H@Z' : Bezeichner wurde auf '255' Zeichen in den Browser-Informationen reduziert
d:\msstudio\vc98\include\map(46) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::_Tree<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::pair<class std::basic_string<
char,struct std::char_traits<char>,class std::allocator<char> > const ,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,struct std::map<class std::basic_string<char,struct std::char_traits<char>,class std::al
locator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<class std::basic_
string<char,struct std::char_traits<char>,class std::allocator<char> > > >::_Kfn,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<class std::basic_string<char,struct std:
:char_traits<char>,class std::allocator<char> > > >'
E:\Test\dw\DW.CPP(5) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<ch
ar>,class std::allocator<char> >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >
> >'
d:\msstudio\vc98\include\xtree(84) : warning C4786: '??Fconst_iterator@?basic_string@DU?allocator@D@2@@std@@U?basic_string@DU?allocator@D@2@@std@@V12@@2@U_Kfn@?basic_string
@DU?allocator@D@2@@std@@V12@U?basic_string@DU?allocator@D@2@@std@@@2@V?basic_string@DU?allocator@D@2@@std@@@2@@2@U?basic_string@DU?allocator@D@2@@std@@@2@V?basic_string@DU?allocator@D@2@@std@@@2@@std@@QAEAAV012@XZ' : Bezeichner wurde auf '255' Zeichen in den Browser-Informationen reduziert
d:\msstudio\vc98\include\map(46) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::_Tree<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::pair<class std::basic_string<
char,struct std::char_traits<char>,class std::allocator<char> > const ,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,struct std::map<class std::basic_string<char,struct std::char_traits<char>,class std::al
locator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<class std::basic_
string<char,struct std::char_traits<char>,class std::allocator<char> > > >::_Kfn,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<class std::basic_string<char,struct std:
:char_traits<char>,class std::allocator<char> > > >'
E:\Test\dw\DW.CPP(5) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<ch
ar>,class std::allocator<char> >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >
> >'
-
Sind eigentlich die Fehlermeldung in neueren Version auch so schwer zu verstehen? Ich hatte einmal einen Bezeichner genutzt, den er nicht gefunden hat. Aber anstatt zu sagen: "unbekannter Bezeichner" wurde ich von Fehlermeldung zugeschüttet und habe Ewigkeiten gebraucht, dass er einfach den Bezeichner nicht kennt. Und was auch nervt ist, dass das VC keine Fehler im Quellcode markiert. Man muss immer compilieren, um zu sehen, ob eine Zeile einen Fehler enthält.
-
Da dran ist nichts falsch, du nutzt einfach nur die STL.
Mach mal oben in die Headerdatei#pragma warning(disable : 4786)
Dann ist Ruhe.
Die Warnung ist auch nicht schlimm, das hier ist der Kern:
Bezeichner wurde auf '255' Zeichen in den Browser-Informationen reduziert
Dem ist einfach eine Zeichenkette zu lang.
-
Hach ist das schön. von 210 auf 0
thx!
-
Das liegt an der alten MSVC6-Version. Weil die Debug-Infos nicht länger als 255 Zeichen lang sein dürfen.
In neueren Versionen ist diese Grenze (natürlich) aufgehoben, und dann gibts auch keine Warnings.
Und wie gesagt, die Warnings und Errors genau lesen:Bezeichner wurde auf '255' Zeichen in den Browser-Informationen reduzier
Ist zwar versteckt, steht da aber, warum das Warning kommt.
Fehlermeldungen sind bei Template-Fehlern auch in neueren Versionen immer besser, kürzer und verständlicher geworden. Zu Zeiten des MSVC6 waren Templates noch unbekanntes Terrain. Heute hat sich das ganze technisch weiter entwickelt, entsprechend entwickelt sich auch der MSVC weiter.
Ist halt eine alte Version die du da hast...
-
Und was auch nervt ist, dass das VC keine Fehler im Quellcode markiert. Man muss immer compilieren, um zu sehen, ob eine Zeile einen Fehler enthält.
Das ist eine etwas schwierige Angelegenheit. Weil C++ sehr komplex ist, kannst du froh sein, das wenigstens der Compiler den Code fehlerhaft erkennt.
Ist jetzt überspitzt dargestellt, aber kommt schon so in etwa hin. Auch ist das Buildsystem ganz anders als bei Java u.a. Sprachen.
ABER (und das habe ich glaube ich auf der ersten Seite des Threads gesagt!) solltest du dir VisualAssistX bestellen!!! Weil das macht Syntaxfehler-Erkennung on the Fly. Zwar nicht perfekt, aber immerhin versucht es und es funktioniert, dafür das C++ so komplex ist.
VisualAssist X hat aber noch mehr Features, vorallem ein besseres IntelliSense, Refactoring-Funktionen usw. Aber muß deine Firma halt mal ca. 115 EUR (je nach Dollarkurs) ausgeben. Lohnt sich!!! Dann kommt schon so Netbeans/Eclipse-Feeling auf.
-
Ich muss nochmal nerven!
Ich habe jetzt eine WTL Anwendung erstellt. Was ich jedoch nicht verstehe ist, dass die vorhandenen Steuerelemente die gleichen sind, unabhängig davon welche Oberfläche ich nutzen will. Müssten diese sich dann nicht unterscheiden? Oder werden die nur unterschiedlich behandelt? Zu WTL finde ich im Netz ja so gut wie keine Infos. WTL und Strukturansicht ergibt selbst in Google 0 Treffer! Ist das so unüblich? Oder sollte ich das Ganze besser nur in MFC schreiben. Da es ein selbstständiges Programm ist, könnte ich das wohl machen, auch wenn alles andere bisher in WTL geschreiben wurde.
Und noch ein kleines Problem. Wie kann ich nun Informationen zu z.B. der Klasse CDialog finden (für WTL oder MFC?!)? Ich habe schon die MSDN befragt und auch andere Seiten, aber ich bekomme einfach nicht raus welches #include ich brauche um diese Klasse zu nutzen. VC6.0 ergänzt zwar den Namen vollautomatisch (warum macht er das, wenn er die Klasse im Quelltext selbst aber nicht kennt?!) aber es sagt mir dann, dass die Basisklasse CDialog undefiniert ist.
Das C++ Buch von Breymann ist wirklich sehr gut geschrieben und dieses arbeite ich nebenbei durch, allerdings hilft es mir bei den Oberflächenproblemen natürlich nicht weiter.
Vielleicht erbarmt sich ja noch jemand auf meine Fragen einzugehen!
Vielen Dank!
-
plizer schrieb:
Wie kann ich nun Informationen zu z.B. der Klasse CDialog finden (für WTL oder MFC?!)? Ich habe schon die MSDN befragt und auch andere Seiten, aber ich bekomme einfach nicht raus welches #include ich brauche um diese Klasse zu nutzen. VC6.0 ergänzt zwar den Namen vollautomatisch (warum macht er das, wenn er die Klasse im Quelltext selbst aber nicht kennt?!) aber es sagt mir dann, dass die Basisklasse CDialog undefiniert ist.
Mach mal den Link auf: http://msdn2.microsoft.com/en-us/library/132s802t.aspx
Drück dann die Ende Taste, dass du den letzten Teil der Seite siehst.
Bei meiner 1200er Auflösung steht jetzt etwa auf halber Höhe unter "Requirements", welchen Include du brauchst.
Das findest du immer bei der Erklärung der jeweiligen Klasse.
Normalerweise muss man es allerdings nicht includen, wundert mich etwas.
-
Liegt es vielleicht daran, dass es ein WTL-Projekt ist und kein MFC?
Auf jeden Fall scheint CDialog schon eingebunden, da nach dem Einfügen von:#include <afxwin.h>
Die Meldung kommt:
fatal error C1189: #Fehler : WINDOWS.H already included. MFC apps must not #include <windows.h>
-
Keine Ahnung, bei WTL muss ich passen.
-
ach, ist doch echt hoffnungslos mit dem ganzen m**t
-
Naja, das Problem sitzt bekanntlich meistens vor dem PC und nicht im PC.
Was ich jedoch nicht verstehe ist, dass die vorhandenen Steuerelemente die gleichen sind, unabhängig davon welche Oberfläche ich nutzen will. Müssten diese sich dann nicht unterscheiden?
Hier weiß ich nicht, was du meinst? Die WTL ist ein OO-Wrapper auf die C-basierten Win32API- und Common-Controls. Die MFC macht genau das gleiche. Es gibt noch weitere solcher OO-Wrapper, die einfach nur die vorhandene Win32-Plattform in C++ wrappen... z.B. SmartWin++ oder wxWidgets. Man muß sich halt nicht mit der Windows-C-API rumschlagen.
Da sie alle von unterschiedlichen Leuten designed und implementiert wurden, unterscheiden sich logischerweise die Wrapper. Jeder hat andere Vorstellungen, wie er es designen würde. Das was am Ende auf dem Bildschirm kommt, ist aber immer originales Windows.
Alle diese Wrapper haben ihre Vor- und Nachteile, wie jede Library/API. Die WTL ist nicht weit verbreitet, hat aber den Vorteil, das sie sich nur auf GUI beschränkt und kompakter ist (wenn man nur eine GUI-Lib sucht). Die MFC ist dagegen verbreiteter und vom Umfang her leistungsfähiger (ist eher ein Application Framework!), aber auch schon von Design her betagter... und es hängt logischerweise ein großer Rattenschwanz dahinter, weil es soviel kann. Du darfst dir jetzt das passende raussuchen.
Zu WTL finde ich im Netz ja so gut wie keine Infos. WTL und Strukturansicht ergibt selbst in Google 0 Treffer! Ist das so unüblich?
Deutsche Suchbegriffe?
Vergiss es! Versuch mal WTL und Treeview oder sowas.
Und das man im Netz nichts findet, stimmt ja auch nicht:
http://wtl.sourceforge.net/
Zuerst die Projekt-Seite anzusteuern, sollte doch eigentlich jeder wissen? Da gibts auch ne Linksammlung, bei der mind. die ersten zwei Links nützlich sind.Oder sollte ich das Ganze besser nur in MFC schreiben. Da es ein selbstständiges Programm ist, könnte ich das wohl machen, auch wenn alles andere bisher in WTL geschreiben wurde.
Ja, könnteste machen.
Wie kann ich nun Informationen zu z.B. der Klasse CDialog finden (für WTL oder MFC?!)? Ich habe schon die MSDN befragt und auch andere Seiten, aber ich bekomme einfach nicht raus welches #include ich brauche um diese Klasse zu nutzen. VC6.0 ergänzt zwar den Namen vollautomatisch (warum macht er das, wenn er die Klasse im Quelltext selbst aber nicht kennt?!) aber es sagt mir dann, dass die Basisklasse CDialog undefiniert ist.
Es gibt nur einen MFC-Header dafür: afxwin.h. Steht auch bei den Requierments in dem von estratu geposteten Link.
Wenn du PCHs aktiviert hast, mußt du die Include-Anweisung unter den "stdafx.h"-Include schreiben.
Die WTL ist aber seit 2000 nicht mehr Bestandteil von MSVC, sondern von MS als Opensource freigegeben.Das C++ Buch von Breymann ist wirklich sehr gut geschrieben und dieses arbeite ich nebenbei durch, allerdings hilft es mir bei den Oberflächenproblemen natürlich nicht weiter.
Ja, weil das Buch ISO-C++ beschreibt. Und WTL nutzt ja wiederrum ISO-C++ plus der Windows-Platform.
-
Artchi schrieb:
Naja, das Problem sitzt bekanntlich meistens vor dem PC und nicht im PC.
Ja, so ist es, dessen bin ich mir bewusst
Hier weiß ich nicht, was du meinst? Die WTL ist ein OO-Wrapper auf die C-basierten Win32API- und Common-Controls. Die MFC macht genau das gleiche. Es gibt noch weitere solcher OO-Wrapper, die einfach nur die vorhandene Win32-Plattform in C++ wrappen... z.B. SmartWin++ oder wxWidgets. Man muß sich halt nicht mit der Windows-C-API rumschlagen.
Da sie alle von unterschiedlichen Leuten designed und implementiert wurden, unterscheiden sich logischerweise die Wrapper. Jeder hat andere Vorstellungen, wie er es designen würde. Das was am Ende auf dem Bildschirm kommt, ist aber immer originales Windows.
Klingt einleuchtend!
Ja, weil das Buch ISO-C++ beschreibt. Und WTL nutzt ja wiederrum ISO-C++ plus der Windows-Platform.
Ok
wieder vielen Dank für Deine Hilfe!