Anhang D. Das C++ Modul

Inhaltsverzeichnis

D.1. Modellieren für C++
D.1.1. Eigenschaftswerte für eine Klasse
D.1.2. Eigenschaftswerte für Attribute
D.1.3. Parameter
D.1.4. Generalisierung
D.1.5. Realisierung
D.1.6. Geschützte Abschnitte

Das ArgoUML C++-Modul (C++-Modul) enthält Funktionalitäten zur C++-Codegenerierung und die C++-Notation. Es arbeitet auf die gleiche Weise wie die anderen Sprachmodule.

D.1. Modellieren für C++

Die C++-Programmiersprache hat Konstrukte, die in UML nicht standardmäßig enthalten sind. Beispiele sind Zeiger, globale Funktionen und Variablen, Referenzen und das überladen von Operatoren. Um uns in die Lage zu versetzen, diese Konstrukte in unseren Modellen anwenden zu können und in der Lage zu sein, die Vorteile dieser Konstrukte bei der Codegeneration und C++-Notation in UML-Diagrammen einsetzen zu können, benutzen die C++-Module die Erweiterungseigenschaften von UML, wie Eigenschaftswerte, Stereotypen und Datentypen.

Weil UML und C++ objektorientiert sind, gibt es eine offensichtliche Korrespondenz zwischen den UML-Modellelementen und den strukturellen C++-Konstrukten, z.B. die UML-Klasse entspricht der C++-Klasse. Diese offensichtlichen Beziehungen werden hier nicht beschrieben, weil angenommen wird, dass ein ArgoUML- Anwender, der für C++ modellieren will, ein grundlegendes Wissen über C++ und UML hat.

Das C++-Modul enthält ein UML-Profil für C++, das Stereotypen und Eigenschaftswerte definiert, die das Modellieren von C++-spezifischen Konstrukten wie Zeiger und Referenzen ermöglichen. Es enthält auch Datentypen, die die eingebauten C++-Typen wie unsigned long int modellieren.

Um diese Konstrukte in unserem Modell verfügbar zu haben, müssen wir das UML-Profil für C++ im Modell ausdrücklich über den Dialog Projekteigenschaften im Register Profile konfigurieren können (siehe Abschnitt 10.3.14, „ Projekteinstellungen... ).

Eigenschaftswerte ist eines der wichtigsten Mittel, über die wir das Verhalten bei der Codegenerierung definieren können. Sie haben einen Namen - die Eigenschaft - und einen Wert, und sind einem Modellelement zugewiesen. Für jedes der möglichen Eigenschaftswerte enthält das C++-Profil eine Eigenschaftswert-Definition, die in einem Stereotypen enthalten ist und auf die Modellelemente angewendet werden kann, zu denen wir den Wert eines Eigenschaftswertes definieren wollen, um ein spezielles Verhalten zu spezifizieren. Um, zum Beispiel, zu definieren, dass der Parameter x eine Referenz ist, nehmen Sie den Stereotypen cppParameter und fügen diesem den Eigenschaftswert reference mit dem Wert true hinzu.

Die Eigenschaftswerte, die im C++-Modul verwendet werden, sind in zwei Kategorien unterteilt:

  • Werte in einem freiem Format - jeder String ist gültig, ausser dem leeren String.

  • Formatierte Werte - der Wert muss einigen Beschränkungen gehorchen, z.B. ein Wert aus true oder false sein (abgekürzt: true || false).

Bei Eigenschaftswerten vom Typ Boolean sind nur die Werte "true" or " false" anwendbar. Wenn ein Eigenschaftswert vom Typ Boolean nicht existiert oder für ein Modellelement ungültig ist, wird vom Codegenerator ein Standardwert angenommen. In der nachfolgenden Dokumentation ist der Standardwert jeweils markiert.

Eigenschaftswerte im freien Format sind nur signifikant, wenn sie vorhanden sind und wenn der Wert kein leerer String ist. Wenn der Wert einer Sortierung folgen muss, wird die ausdrücklich erwähnt. In diesem Fall gibt es eine Chance, dass der Wert ungültig ist. Wenn der Wert ungültig ist, wird keine Annahme getroffen; der Generator wird das Problem verfolgen und den Eigenschaftswert ignorieren.

D.1.1. Eigenschaftswerte für eine Klasse

Um eine Eigenschaftswert-Definitionen für eine C++-Klasse zur Verfügung zu stellen, wenden wird den Stereotypen cppClass auf die Klasse an.

Konstruktor

true - generiert einen Standardkonstruktor für die Klasse.

false (Standard) - es wird kein Standardkonstruktor generiert, es sei denn, er wurde ausdrücklich mit dem Stereotypen «create» modelliert.

header_incl

Name der Datei, die in den Kopf eingefügt werden soll.

[Anmerkung]Anmerkung

Wenn wir mehrere Header auf diesem Wege einfügen wollen, verwenden Sie mehrere Eigenschaftswerte mit der Bezeichnung (Tag) header_incl.

Andere, für die C++-Modellierung verwendete Eigenschaftswerte können auch auf diesem Weg verwendet werden. Dieser Hinweis wird in diesen Fällen nicht wiederholt werden.

source_incl

Der Name der Datei, die in die Quelldatei (.cpp -Datei) eingefügt werden soll.

typedef_public

<source type><type_name> - erzeugt eine typedef-Zeile im Public-Bereich der Klasse mit typedef <source type><type name>.

typedef_protected

Wie bei typedef_public, aber im protected-Bereich.

typedef_private

Wie bei typedef_public, aber im private-Bereich.

typedef_global_header

Wie bei typedef_public, aber im globalen Bereich es Headers (Kopfes).

typedef_global_source

Wie bei typedef_global_source, aber in der Quelldatei.

TemplatePath

Directory - sucht im angegebenen Verzeichnis nach den Templatedateien "header_template" und "cpp_template", die oben in die entsprechende Datei eingefügt werden. Die folgenden Tags der Templatedatei werden durch folgende Modellwerte ersetzt: |FILENAME|, |DATE|, |YEAR|, |AUTHOR|, |EMAIL|. Wenn kein solches Tag spezifiziert wurde, werden die Templates im Unterverzeichnis des Wurzelverzeichnisses für die Codegenerierung gesucht.

email

name@domain.country - ersetzt das Tag |EMAIL| der Templatedatei.

author

name - ersetzt das Tag |AUTHOR| der Templatedatei.

[Anmerkung]Anmerkung

Sie können einfach die Autor-Eigenschaft im Register Dokumentation verwenden.

D.1.2. Eigenschaftswerte für Attribute

UML-Attribute werden auf die Membervariablen der Klassen zugeordnet. Um die Tag- Definitionen für die C++-Membervariablen verfügbar zu machen, verwenden wird den Stereotypen cppAttribute.

pointer

true - der Typ der Membervariable wird ein Zeiger auf den Attributtyp sein.

Zum Beispiel: Wenn Sie das UML-Attribut: name:std::string mit dem Eigenschaftswert pointer auf true haben, ist die generierte Membervariable: std::string*name;

false (Standard) - es wird kein Zeiger angewendet.

reference

true - der Typ der Membervariable wird eine Referenz auf den Attributtyp sein.

false (Standard) - es wird keine Referenz angewendet.

usage

header - wird zu Klassentypen mit einer Vordeklaration im Header führen, und zum Einfügen des Remote-Klassenheaders (-kopfes) in den Header (Kopf) der generierten Klasse.

MultiplicityType

list || slist || vector || map || stack || stringmap - wird eine Kardinalität als korrespondierenden STL-Container definieren, wenn der Kardinalitäts- Bereich des Attributes variabel ist (bei festen Bereichen wird die Einstellung ignoriert).

set

private || protected || public - erzeugt eine einfache Funktion, um das Attribut durch eine Funktion zu setzen (Aufruf per Referenz wird für Klassentypen anstelle von Aufruf per Wert verwendet); plaziert die Funktion in den angegebenen Sichtbarkeitsbereich.

get

private || protected || public - wie bei set.

D.1.3. Parameter

Um eine Tag-Definitionen für ein C++-Argument verfügbar zu machen, wenden wir den Stereotyp cppParameter auf ihn an.

D.1.3.1. Übergabesemantik Variable

Wenn ein Parameter für eine Operation als out oder inout gekennzeichnet ist, wird die Variable per Referenz (Standard) oder Zeiger (benötigt den Eigenschaftswert pointer - siehe oben) übergeben. Im anderen Fall per Wert.

Rückgabewerte sind in UML einfach Parameter, gekennzeichnet mit return. Also alles, was hier für sie gilt, sofern nicht ausdrücklich darauf hingewiesen.

[Warnung]Warnung

Beachten Sie, dass UML mehrere Rückgabewerte erlaubt. Dies ist möglich, und wird in C++ durch out-Parameter unterstützt, aber, es wird derzeit vom Generator nicht unterstützt.

Dieses Problem wird unter issue #3553 - handle multiple return parameters behandelt.

D.1.3.2. Eigenschaftswerte für Parameter

pointer

true || false (Standard) - das gleiche wie bei Attribute.

reference

dto.

D.1.4. Generalisierung

Um die Tag-Definition für eine C++-Generalisierung zur Verfügung zu stellen, wenn wir den Stereotypen cppGeneralization an.

D.1.4.1. Eigenschaftswerte für Generalisierung

cpp_virtual_inheritance

true || false (Standard) - wird zur Spezifikation der virtuellen Vererbung verwendet.

cpp_inheritance_visibility

public (Standard) || private || protected - wird verwendet, um die Sichtbarkeit der Vererbung zu spezifizieren.

D.1.5. Realisierung

Um die Tag-Definition für die C++-Realisierung zur Verfügung zu stellen, wenden wir den Stereotypen cppRealization an.

D.1.5.1. Eigenschaftswerte für Realisierung

cpp_inheritance_visibility

public (Standard) || private || protected - wird verwendet, um die Sichtbarkeit der Vererbung zu spezifizieren.

D.1.6. Geschützte Abschnitte

Bei jeder Codegenerierung werden spezielle Kommentare vor und nach den Funktionsdefinitionen generiert:

  function Testclass::Testclass()
  // section -64--88-0-40-76f2e8:ec37965ae0:-7fff begin
 {
 }
  // section -64--88-0-40-76f2e8:ec37965ae0:-7fff end
      

Der gesamte Code, der von Ihnen zwischen den "begin"- und "end"-Zeilen eingefügt wird, bleibt erhalten, wenn Sie den Code erneut generieren. Bitte ändern Sie nichts innerhalb dieser Zeilen, weil die Abschnitte durch diese Kommentarsyntax erkannt werden. Da die, geschweiften Klammern innerhalb des geschützten Bereiches platziert wurden, bleibt auch die Attributinitalisierung in den Konstruktoren erhalten.

Die passiert auch, wenn Sie die Methodennamen nach dem Generieren ändern.

  void newOperation(std::string test = "fddsaffa")
  // section 603522:ec4c7ff768:-7ffc begin
 {
 }
  // section 603522:ec4c7ff768:-7ffc end
      

Wenn Sie eine Operation im Modell löschen. Da nächste Mal, wenn die Klasse generiert wird, wird der gelöschte Code - z.B. die ganze Funktionsdefinition - als Kommentar am Ende der Datei hinzugefügt.