Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

11

27.09.2007, 11:33

Zitat von »"$nooc"«


das mit den funktionen die nichts an den memvars ändern:
ich bin das ein bischen gewöhnt Get() und Set() funktionen zu schreiben, ich glaube deshalb hab ich nicht an const gedacht..


Das eine schließt das andere ja nichts aus.

Zitat von »"$nooc"«


wenn ich bei create const::WNDCLASSEX& verwende, welche vorteile hab ich da genau gegenüber der anderen variante?


Du meinst:

C-/C++-Quelltext

1
const WNDCLASSEX& 


Der Vorteil ist z.B. der Funktionsaufruf, statt:

C-/C++-Quelltext

1
2
WNDCLASSEX wc = { ... };
create( &wc );


einfach:

C-/C++-Quelltext

1
2
WNDCLASSEX wc = { ... };
create( wc );


Das "const" gewährleistet das dein übergebenes Objekt nicht geändert wird.

Zitat von »"$nooc"«


das mit APIENTRY und LPSTR versteh ich nicht.. wo löse ich da was auf? ^^


Du hast stattdessen __stdcall und char* verwendet. Das nennt sich dann auflösen!

Zitat von »"$nooc"«


ne letzte frage hab ich noch:

kurze einleitung:
c++ ist so unglaublich umfangreich! es gibt nach meiner auffassung nur wenig grenzen.. im internet findet man tutorials zu ALLEN sachen .. aber eines findet man nicht (oder kaum):
FAUSTREGELN!


Die eignet man sich durch viel Praxis und Erfahrung an.

Zitat von »"$nooc"«


zb eben: wann ist was protected, private oder publlic?


Immer genau dann wenn es Sinn macht die jeweiligen Spezifikatoren zu verwenden. Du kannst dir aber merken: Je weniger direkter Zugriff möglich ist, desto besser.

Zitat von »"$nooc"«


wann ist ->unbedingt<- const?


Immer, nur dann nicht wenn kein const erlaubt ist (z.B. wenn Membervariablen geändert werden sollen, oder wenn übergebene Objekte änderbar sein sollen, ...)!

Zitat von »"$nooc"«


es sind so viele kleinigkeiten.. dasselbe mit pointern?


Referenzen sind Zeigern normal vorzuziehen. Aber wenn du Zeiger verwendest gelten da ähnliche Regeln.

Zitat von »"$nooc"«


wann gibt man ne variable auf den stack, wann übergibt man zeiger?


Das kann man so nicht festlegen. Du kannst ja auch Zeiger auf Objekte auf dem Stack übergeben. Normal übergibt man Referenzen oder Zeiger dann wenn man unnötige temporäre Kopien vermeiden, oder wenn man Objekte aus der Funktion raus ändern will.

Zitat von »"$nooc"«


es sind genau diese dinge die meiner meinung nach "guten code" ausmachen.. aber leider scheine ich nicht in der lage zu sein weiter zu kommen.. an dem punkt steh ich jetz schon ziemlich lange würd ich mal sagen.. ich komme mit meinem "skill" einfach nicht voran..


Wie gesagt, viel Praxis und viel Erfahrung helfen hier!
@D13_Dreinig

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

12

27.09.2007, 12:06

Zitat von »"$nooc"«

hast du/habt ihr vllt. ein paar faustregeln für mich? :?


unbedingt zu empfehlen (gibts auch auf deutsch)

13

27.09.2007, 15:05

Zitat

wann gibt man ne variable auf den stack, wann übergibt man zeiger?
Hmm ist nicht ganz korrekt aber meist, wenn der Inhalt dynamisch sein soll, dan nutzt man den Heap, sonnst den Stack.

Zitat

es sind so viele kleinigkeiten.. dasselbe mit pointern?
Ehm immer Referenzen bis auf wenn du die Möglichkeit haben willst NULL zu übergeben.

Zitat

jop, das eine oder andere problem hatte ich bereits mit WndProc() ^^
Dann ne "einfache" Erklären wie man es lösen kann (es ist nicht die Einzige!):
1. class Window bekommt eine static LRESULT __window_proc(HWND, UINT, WPARAM, LPARAM). Diese guckt ob die Message WM_(NC)CREATE ist und wenn ja, kannst du Zusatzdaten, die du bei CreateWindowEx angeben kannst(this-Zeiger!) per LPCREATEPARAMS übergeben. Per SetWindowLong(hWnd, SWL_USERDATA) kannst du einem HWND noch Daten anhängen. Das machen wir mit dem übergebenen this-Zeiger. Wenn die __window_proc jetzt aufgerufen wird und die Message nicht WM_(NC)CREATE ist, dann holst du mit GetWindowLong wieder den this->Zeiger. Wenn die USERDATA des HWNDs nicht gleich NULL sind bzw. du einen validen this->Zeiger hast, rufst du _window_proc auf. Ansonsten einfach DefWindowProc.
2. LRESULT _window_proc(HWND, UINT, WPARAM, LPARAM) nutzt jetzt eine std::map<UINT, fnWindowMsg>, in die du Memberfunktionen reinpackst, um die entsprechende Funktion aufzurufen.
3. fnWindowMsg kann bsw. so aussehen: typedef LRESULT(Window::*fnWindowProc)(WPARAM, LPARAM);
4. Der aufruf bei 2. sähe in etwa so aus: return (it != m_map.end() ? (*this.*(*it).second)(wParam, lParam) : DefWindowProc(hWnd, msg, wParam, lParam);

:D so wenn du das verstanden hast is ja gut ;)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

14

27.09.2007, 15:24

nur ein kleiner hinweis: um einen zeiger ins fenster zu packen, solltest du in zeiten von x64 SetWindowLongPtr() verwenden ;)

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

15

27.09.2007, 18:56

danke mal für die ganzen tipps!
werde versuchen sie mir zu merken, bzw. gleich anzuwenden!

zu dem buch hier

ist das zu empfehlen für einen anfänger wie mich?
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

16

27.09.2007, 19:24

Das Buch ist zwar sehr nützlich aber für einen Anfänger nicht zu empfehlen. Ich habs mir direkt am Anfang gekauft und konnte erst 1 Jahr später wirklich was damit anfangen. Gerade wenn man, wie du selbst sagtest, in OOP noch am Sand ist.
Was du aber unbedingt ändern solltest weil OOP so ziemlich das A und O in Sachen C++ Programmierung ist (von .NET von dem alle außer mir so furchtbar begeißtert sind was jeder Anfänger benutzen sollte damit er ja nix selbst macht :roll: gar nicht zu reden).

PS: Nimm die Kritik von den anderen wegen deinem Code nicht demotivierend! Aber nur so lernt man vernünftigen Code zu schreiben! ;)
Das Böse ist des Menschensbeste Kraft - Friedrich Nietzsche

xCite

Frischling

Beiträge: 77

Wohnort: Deutschland

Beruf: Berufsfachschüler

  • Private Nachricht senden

17

27.09.2007, 19:41

Zitat von »"Theprogrammer"«

PS: Nimm die Kritik von den anderen wegen deinem Code nicht demotivierend! Aber nur so lernt man vernünftigen Code zu schreiben! ;)


Aber auch das lässt sich konstruktiv machen, fand das $nooc gegenüber ziemlich unfair. (3. Beitrag) Nur mal als Hinweis für das nächste Mal.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

18

27.09.2007, 21:28

Zitat von »"Theprogrammer"«


weil OOP so ziemlich das A und O in Sachen C++ Programmierung ist


Wer verzapft denn so einen Unsinn? :) Gerade das schöne an C++ ist doch das es verschiedene Paradigmen und vorallem das mischen dieser zulässt!
@D13_Dreinig

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

19

27.09.2007, 22:58

nur nochmal ganz kurz zu dem einen fehler da:

Zitat von »"Compiler"«


Fehler 1 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_main" in Funktion "___tmainCRTStartup". MSVCRTD.lib

Fehler 2 fatal error LNK1120: 1 nicht aufgelöste externe Verweise. Fensterklasse.exe 1


mein fenster will ich aus einer win32-consolenanwendung starten..
kann es sein dass ich irgendwas nicht beachte??
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

20

27.09.2007, 23:03

du hast keine main funktion. vermutlich hast du eine WinMain funktion geschrieben. dann müsstest du aber ein win32 projekt machen und kein konsolenprojekt.

wenn du ein konsolenprojekt hast, brauchst du eine main funktion. du kannst aber trozdem in dieser main funktion ein fenster machen ;)

Werbeanzeige