Programmiertools richtig nutzen - Seite 2

Die DLL und der Kreis

Die DLL und der Kreis

Im Rahmen dieses Beispiels wird die DLL allerdings absichtlich sehr klein und übersichtlich gehalten: Es wird nur eine einzelne Kreis Klasse mit einem ganz einfachem Interface definiert.



Das Beispielprogramm erzeugt einen Kreis im sichtbaren Bereich des Fensters.

Zusätzlich zu den vom Assistenten erzeugten Dateien brauchen Sie dazu zwei weitere: Eine Header-Datei die die Informationen über die Klasse enthält, und eine CPP Datei in der die Implementierung der Klasse abgelegt wird.

Dabei ist eines zu berücksichtigen: Anders als bei den bisherigen Projekten wird die Header-Datei nicht ausschließlich vom DLL Projekt verwendet, sondern muss auch von anderen Projekten benutzbar sein. Das bedeutet inhaltlich, dass diese Datei ausschließlich Symbole verwenden darf, die auch in anderen Projekten definiert sein werden. Mit anderen Worten: Es darf keine Referenzen auf Symbole geben, die nur lokal zum DLL Projekt bekannt sind.

Im Beispielprojekt trägt die Header-Datei den Namen 'circle.h' und hat folgenden Inhalt:

#ifndef _INC_CIRCLE_H
#define _INC_CIRCLE_H

class AFX_EXT_CLASS Circle
{
public:
Circle( CPoint pt);
~Circle();
void Draw( CDC* pDC);

private:
Circle();
CPoint m_pt;
};
#endif // _INC_CIRCLE_H

Dazu sind einige Dinge zu sagen. Zunächst einmal sehen Sie einige Präprozessor Statements die Sie vermutlich noch nicht kennen: Das sind #ifndef, #define und #endif.

Diese Statements kümmern sich darum, dass der Inhalt der Header-Datei innerhalb einer Übersetzungseinheit nicht mehrfach inkludiert wird. Dazu prüft der Präprozessor zunächst einmal, ob das Symbol _INC_CIRCLE_H definiert ist. Ist das nicht der Fall, wird das Symbol zunächst definiert und dann folgt die Klassendefinition. Ist das Symbol hingegen schon definiert, dann wurde die Datei im Rahmen der aktuellen Übersetzung bereits einmal inkludiert - und der Präprozessor für dann den Codeblock bis zum abschließenden #endif eben nicht ein. Sie können sich ein #ifdef / #endif Paar also so ähnlich vorstellen wie einen if() {} Block im C(++) Quellcode - nur wird dieser Bedingungen eben zur Compilierzeit und nicht zur Laufzeit ausgewertet.

Zur Circle Klasse selbst ist nicht viel zu sagen: Sie hat einen Konstruktor der einen Parameter enthält - das wird der Mittelpunkt des Kreises werden - sowie eine Destruktor. Ferner gibt es eine Methode Draw() die offensichtlich für das Zeichnen des Kreises zuständig sein wird. Der private Konstruktor ohne Parameter stellt sicher dass keine Kreise ohne Mittelpunkts-Angabe erzeugt werden können.

Artikel kommentieren