Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Klassen-Designer zeigt eine visuelle Entwurfsoberfläche namens Klassendiagramm an, die eine visuelle Darstellung der Codeelemente in Ihrem Projekt bereitstellt. Sie können Klassendiagramme verwenden, um Klassen und andere Typen in einem Projekt zu entwerfen und zu visualisieren.
Klassen-Designer unterstützt die folgenden C++-Codeelemente:
Klasse (ähnelt einem verwalteten Klassen-Shape, mit der Ausnahme, dass sie mehrere Vererbungsbeziehungen haben kann)
Anonyme Klasse (zeigt den generierten Namen der Klassenansicht für den anonymen Typ an)
Vorlagenklasse
Struktur
Enum
Makro (zeigt die Nachbearbeitungsansicht des Makros an)
TypeDef
Hinweis
Dies ist nicht mit dem UML-Klassendiagramm identisch, das Sie in einem Modellierungsprojekt erstellen können. Weitere Informationen finden Sie unter UML-Klassendiagramme: Referenz.
C++-Klassen im Klassen-Designer
Klassen-Designer unterstützt C++-Klassen und visualisiert systemeigene C++-Klassen auf die gleiche Weise wie Visual Basic- und C#-Klassen-Shapes, außer dass C++-Klassen mehrere Vererbungsbeziehungen haben können. Sie können das Klassen-Shape erweitern, um weitere Felder und Methoden in der Klasse anzuzeigen oder zu reduzieren, um Platz zu sparen.
Hinweis
Der Klassen-Designer unterstützt keine Vereinigungen (eine spezielle Art von Klasse, in der der zugeordnete Speicher nur die für das größte Datenmitglied der Union erforderliche Menge ist).
Einfache Vererbung
Wenn Sie mehrere Klassen auf ein Klassendiagramm ziehen und die Klassen eine Klassenvererbungsbeziehung aufweisen, verbindet ein Pfeil sie. Der Pfeil zeigt in Richtung der Basisklasse. Wenn beispielsweise die folgenden Klassen in einem Klassendiagramm angezeigt werden, verbindet ein Pfeil sie, der von B zu A zeigt:
class A {};
class B : A {};
Sie können auch nur Klasse B in das Klassendiagramm ziehen, mit der rechten Maustaste auf das Klassen-Shape für B klicken und dann auf " Basisklassen anzeigen" klicken. Dadurch wird die Basisklasse A angezeigt.
Mehrfachvererbung
Klassen-Designer unterstützt die Visualisierung von Vererbungsbeziehungen mit mehreren Klassen. Mehrere Vererbung wird verwendet, wenn eine abgeleitete Klasse Attribute von mehr als einer Basisklasse aufweist. Nachfolgend sehen Sie ein Beispiel für mehrere Vererbungen:
class Bird {};
class Swimmer {};
class Penguin : public Bird, public Swimmer {};
Wenn Sie mehr als eine Klasse auf das Klassendiagramm ziehen und die Klassen über eine Vererbungsbeziehung mit mehreren Klassen verfügen, verbindet ein Pfeil sie. Der Pfeil zeigt in Richtung der Basisklassen.
Wenn Sie mit der rechten Maustaste auf ein Klassen-Shape klicken und dann auf " Basisklassen anzeigen" klicken, werden die Basisklassen für die ausgewählte Klasse angezeigt.
Hinweis
Der Befehl 'Abgeleitete Klassen anzeigen' wird für C++-Code nicht unterstützt. Sie können abgeleitete Klassen anzeigen, indem Sie zu "Klassenansicht" wechseln, den Typknoten erweitern, den Unterordner " Abgeleitete Typen " erweitern und diese Typen dann auf das Klassendiagramm ziehen.
Weitere Informationen zur Vererbung mehrerer Klassen finden Sie unter "Mehrfachvererbung " und "Mehrere Basisklassen".
Abstrakte Klassen
Klassen-Designer unterstützt abstrakte Klassen (auch als abstrakte Basisklassen bezeichnet). Dies sind Klassen, die Sie nie instanziieren, aber von denen Sie andere Klassen ableiten können. Mithilfe eines Beispiels aus "Mehrfachvererbung" weiter oben in diesem Dokument können Sie die Bird Klasse wie folgt als einzelne Objekte instanziieren:
int main()
{
Bird sparrow;
Bird crow;
Bird eagle;
}
Möglicherweise möchten Sie die Swimmer Klasse jedoch nicht als einzelne Objekte instanziieren. Es könnte Ihre Absicht sein, nur andere Arten von Tierklassen davon abzuleiten, z. B. Penguin, Whale und Fish. In diesem Fall würden Sie die Swimmer Klasse als abstrakte Basisklasse deklarieren.
Um eine Klasse als abstrakt zu deklarieren, können Sie das abstract Schlüsselwort verwenden. Elemente, die als abstrakt gekennzeichnet oder in einer abstrakten Klasse enthalten sind, sind virtuell und müssen von Klassen implementiert werden, die von der abstrakten Klasse abgeleitet werden.
class Swimmer abstract
{
virtual void swim();
void dive();
};
Sie können eine Klasse auch als abstrakt deklarieren, indem Sie mindestens eine reine virtuelle Funktion einschließen:
class Swimmer
{
virtual void swim() = 0;
void dive();
};
Wenn Sie diese Deklarationen in einem Klassendiagramm anzeigen, werden der Klassenname Swimmer und seine reine virtuelle Funktion swim kursiv in einer abstrakten Klassenform zusammen mit der Notation Abstract Class angezeigt. Beachten Sie, dass das abstrakte Klassentyp-Shape mit der einer regulären Klasse identisch ist, mit der Ausnahme, dass der Rahmen eine gepunktete Linie ist.
Eine von einer abstrakten Basisklasse abgeleitete Klasse muss jede reine virtuelle Funktion in der Basisklasse überschreiben, oder die abgeleitete Klasse kann nicht instanziiert werden. Wenn Sie zum Beispiel eine Fish-Klasse von der Swimmer-Klasse ableiten, muss Fish die swim-Methode überschreiben.
class Fish : public Swimmer
{
void swim(int speed);
};
int main()
{
Fish guppy;
}
Wenn Sie diesen Code in einem Klassendiagramm anzeigen, zeichnet der Klassen-Designer eine Vererbungslinie von Fish zu Swimmer.
Anonyme Kurse
Der Klassen-Designer unterstützt anonyme Klassen. Anonyme Klassentypen sind Klassen, die ohne Bezeichner deklariert werden. Sie können keinen Konstruktor oder Destruktor haben, können nicht als Argumente an Funktionen übergeben werden und können nicht als Rückgabewerte von Funktionen zurückgegeben werden. Sie können eine anonyme Klasse verwenden, um einen Klassennamen durch einen Typedef-Namen zu ersetzen, wie im folgenden Beispiel gezeigt:
typedef struct
{
unsigned x;
unsigned y;
} POINT;
Strukturen können auch anonym sein. Der Klassen-Designer zeigt anonyme Klassen und Strukturen auf die gleiche Weise an wie den jeweils entsprechenden Typ. Obwohl Sie anonyme Klassen und Strukturen deklarieren und anzeigen können, verwendet Der Klassen-Designer nicht den von Ihnen angegebenen Tagnamen. Er verwendet den Namen, den die Klassenansicht generiert. Die Klasse oder Struktur wird in der Klassenansicht und im Klassen-Designer als Element mit dem Namen __unnamed angezeigt.
Weitere Informationen zu anonymen Klassen finden Sie unter "Anonyme Klassentypen".
Vorlagenklassen
Klassen-Designer unterstützt die Visualisierung von Vorlagenklassen. Geschachtelte Deklarationen werden unterstützt. In der folgenden Tabelle sind einige typische Deklarationen aufgeführt.
| Codeelement | Ansicht "Klassen-Designer" |
|---|---|
template <class T>class A {}; |
A<T>Template-Klasse |
template <class T, class U>class A {}; |
A<T, U>Template-Klasse |
template <class T, int i>class A {}; |
A<T, i>Template-Klasse |
template <class T, template <class K> class U>class A {}; |
A<T, U>Template-Klasse |
In der folgenden Tabelle sind einige Beispiele für partielle Spezialisierung aufgeführt.
| Codeelement | Klassen-Designer-Ansicht |
|---|---|
template<class T, class U>class A {}; |
A<T, U>Template-Klasse |
template<class T>class A<T, T> {}; |
A<T, T>Template-Klasse |
template <class T>class A<T, int> {}; |
A<T, int>Template-Klasse |
template <class T1, class T2>class A<T1*, T2*> {}; |
A<T1*, T2*>Template-Klasse |
In der folgenden Tabelle sind einige Beispiele für die Vererbung in teilweiser Spezialisierung aufgeführt.
| Codeelement | Ansicht "Klassen-Designer" |
|---|---|
template <class T, class U>class A {};template <class TC>class A<T, int> {};class B : A<int, float>{};class C : A<int, int>{}; |
A<T, U>Template-Klasse BClass (verweist auf Klasse A) CClass (verweist auf Klasse A) |
Die folgende Tabelle enthält einige Beispiele für Partielle Spezialisierungsvorlagenfunktionen.
| Codeelement | Klassen-Designer-Ansicht |
|---|---|
class A{template <class T, class U>void func(T a, U b);template <class T>void func(T a, int b);}; |
AFunc<T, U> (+ 1 Überladung) |
template <class T1>class A {template <class T2>class B {};};template<> template<>class A<type>::B<type> {}; |
A<T1>Template-Klasse B<T2>Template-Klasse (B ist in Klasse A unter Verschachtelte Typen enthalten) |
template <class T>class C {};class A : C<int> {}; |
AClass -> C<int> C<T>Template-Klasse |
Die folgende Tabelle enthält einige Beispiele für die Vorlagenvererbung.
| Codeelement | Klassendesigner-Ansicht |
|---|---|
template <class T>class C {};template<>class C<int> {class B {};}class A : C<int>::B {}; |
AClass ->B C<int>Class (B ist in der Klasse C unter Verschachtelte Typen enthalten) C<T>Template-Klasse |
Die folgende Tabelle enthält einige Beispiele für kanonische spezialisierte Klassenverknüpfungen.
| Codeelement | Ansicht "Klassen-Designer" |
|---|---|
template <class T>class C {};template<>class C<int> {};class A : C<int> {};class D : C<float> {}; |
AClass ->C<int> C<int>Class C<T>Template-Klasse DClass ->C<float> |
class B {template <class T>T min (const T &a, const T &b);}; |
Bmin <T> |
C++-Enumerationen im Class Designer
Klassen-Designer unterstützt C++ enum - und Bereichstypen enum class . Es folgt ein Beispiel:
enum CardSuit {
Diamonds = 1,
Hearts = 2,
Clubs = 3,
Spades = 4
};
// or...
enum class CardSuit {
Diamonds = 1,
Hearts = 2,
Clubs = 3,
Spades = 4
};
Ein C++-Aufzählungselement in einem Klassendiagramm sieht ähnlich aus und funktioniert wie eine Strukturform, mit der Ausnahme, dass die Bezeichnung Enum oder Enum-Klasse trägt, statt blau ist es rosa, und es hat einen farbigen Rand am linken und oberen Rand. Sowohl Enumerationsformen als auch Strukturformen haben quadratische Ecken.
Weitere Informationen zur Verwendung des enum Typs finden Sie unter Enumerationen.
C++-Typedefs im Klassen-Designer
Typedef-Anweisungen erstellen eine oder mehrere Umleitungsebenen zwischen einem Namen und dem zugrunde liegenden Typ.
Klassen-Designer unterstützt C++-Typedef-Typen, die mit dem Schlüsselwort typedefdeklariert werden, z. B.:
typedef class coord
{
void P(x,y);
unsigned x;
unsigned y;
} COORD;
Sie können dann diesen Typ verwenden, um eine Instanz zu deklarieren:
COORD OriginPoint;
Klassen- und Struktur-Shapes
Im Klassen-Designer weist ein C++-Typedef die Form des typs auf, der in der Typedef angegeben ist. Wenn die Quelle typedef class deklariert, hat die Form abgerundete Ecken und ist mit Class beschriftet. Für typedef struct, die Form hat eckige Ecken und das Etikett Struct.
Klassen und Strukturen können verschachtelte Typedefs enthalten, die darin deklariert werden. Im Klassen-Designer können Klassen- und Strukturformen geschachtelte Typedef-Deklarationen als geschachtelte Formen anzeigen.
Typedef-Shapes unterstützen die Befehle "Als Verknüpfung anzeigen" und "Als Sammlungsverknüpfung anzeigen" im Kontextmenü.
Klassentypedef-Beispiel
class B {};
typedef B MyB;
"Typdef-Strukturbeispiel"
typedef struct mystructtag
{
int i;
double f;
} mystruct;
Unbenannte Typedefs
Obwohl Sie einen Typedef ohne Namen deklarieren können, verwendet Der Klassen-Designer nicht den von Ihnen angegebenen Tagnamen. Der Klassen-Designer verwendet den Namen, den die Klassenansicht generiert. Die folgende Deklaration ist beispielsweise gültig, wird jedoch in der Klassenansicht und im Klassen-Designer als Objekt mit dem Namen __unnamed angezeigt:
typedef class coord
{
void P(x,y);
unsigned x;
unsigned y;
};
Hinweis
Der Klassen-Designer zeigt keine Typedefs an, deren Quelltyp ein Funktionszeiger ist.
Informationen zu Einschränkungen für C++-Codeelemente
Wenn ein C++-Projekt geladen wird, funktioniert Class Designer im nur-Lese-Modus. Sie können das Klassendiagramm ändern, aber Sie können keine Änderungen aus dem Klassendiagramm wieder im Quellcode speichern.
Klassen-Designer unterstützt nur systemeigene C++-Semantik. Bei C++-Projekten, die in verwaltetem Code kompiliert werden, visualisiert Class Designer nur Codeelemente, die systemeigene Typen sind. Daher können Sie einem Projekt ein Klassendiagramm hinzufügen, aber Der Klassen-Designer ermöglicht es Ihnen nicht, Elemente zu visualisieren, auf die die
IsManagedEigenschaft festgelegttrueist (d. a. Werttypen und Verweistypen).Bei C++-Projekten liest der Klassen-Designer nur die Definition des Typs. Gehen Sie beispielsweise davon aus, dass Sie einen Typ in einer Headerdatei (H) definieren und ihre Member in einer Implementierungsdatei (.cpp) definieren. Wenn Sie in der Implementierungsdatei (.cpp) "Klassendiagramm anzeigen" aufrufen, wird im Klassen-Designer nichts angezeigt. Ein weiteres Beispiel: Wenn Sie "Klassendiagramm anzeigen" für eine .cpp Datei aufrufen, die eine
#includeAnweisung verwendet, um andere Dateien einzuschließen, aber keine tatsächlichen Klassendefinitionen enthält, zeigt der Klassen-Designer erneut nichts an.IDL-Dateien, die COM-Schnittstellen und Typbibliotheken definieren, werden nicht in Diagrammen angezeigt, es sei denn, sie werden in systemeigenem C++-Code kompiliert.
Der Klassen-Designer unterstützt keine globalen Funktionen und Variablen.
Klassen-Designer unterstützt keine Gewerkschaften. Dies ist eine spezielle Art von Klasse, in der der zugeordnete Arbeitsspeicher nur die für das größte Datenmitglied der Union erforderliche Menge ist.
Der Klassen-Designer zeigt keine grundlegenden Datentypen wie z. B.
intundcharan.Der Klassen-Designer zeigt keine Typen an, die außerhalb des aktuellen Projekts definiert sind, wenn das Projekt keine korrekten Verweise auf diese Typen enthält.
Der Klassen-Designer kann geschachtelte Typen, aber nicht die Beziehungen zwischen einem geschachtelten Typ und anderen Typen anzeigen.
Der Klassen-Designer kann keine Typen anzeigen, die nichtig sind oder von einem ungültigen Typ abgeleitet sind.
Typauflösungs- und Anzeigeprobleme beheben
Speicherort der Quelldateien
Der Klassen-Designer verfolgt nicht den Speicherort der Quelldateien. Wenn Sie die Projektstruktur ändern oder Quelldateien in Ihrem Projekt verschieben, kann Class Designer daher den Überblick über den Typ verlieren (insbesondere den Quelltyp eines Typs, basisklassen oder Zuordnungstypen). Möglicherweise wird ein Fehler angezeigt, z. B. Der Klassen-Designer kann diesen Typ nicht anzeigen. Wenn Sie dies tun, ziehen Sie den geänderten oder verschobenen Quellcode erneut in das Klassendiagramm, um es erneut anzuzeigen.
Update- und Leistungsprobleme
Bei C++-Projekten kann es 30 bis 60 Sekunden dauern, bis eine Änderung in der Quelldatei im Klassendiagramm angezeigt wird. Diese Verzögerung kann auch dazu führen, dass der Klassen-Designer den Fehler Keine Typen wurden in der Auswahl gefunden auslöst. Wenn ein solcher Fehler auftritt, klicken Sie in der Fehlermeldung auf Abbrechen und warten Sie, bis das Codeelement in der Klassenansicht angezeigt wird. Danach sollte der Klassen-Designer in der Lage sein, den Typ anzuzeigen.
Wenn ein Klassendiagramm nicht mit Änderungen aktualisiert wird, die Sie im Code vorgenommen haben, müssen Sie das Diagramm möglicherweise schließen und es erneut öffnen.
Probleme bei der Typauflösung
Der Klassen-Designer kann Typen aus den folgenden Gründen möglicherweise nicht auflösen:
Der Typ befindet sich in einem Projekt oder einer Assembly, auf das nicht aus dem Projekt verwiesen wird, das das Klassendiagramm enthält. Um diesen Fehler zu beheben, fügen Sie einen Verweis auf das Projekt oder die Assembly hinzu, das den Typ enthält. Weitere Informationen finden Sie unter Verwalten von Verweisen in einem Projekt.
Der Typ befindet sich nicht im richtigen Bereich, sodass der Klassen-Designer ihn nicht finden kann. Stellen Sie sicher, dass im Code keine
using,importsoder#includeAnweisung fehlt. Stellen Sie außerdem sicher, dass Sie den Typ (oder einen verwandten Typ) nicht aus dem Namespace verschoben haben, in dem er sich ursprünglich befand.Der Typ ist nicht vorhanden (oder wurde auskommentiert). Um diesen Fehler zu beheben, stellen Sie sicher, dass Sie den Typ nicht auskommentiert oder gelöscht haben.
Der Typ befindet sich in einer Bibliothek, auf die mithilfe einer #import-Direktive verwiesen wird. Eine mögliche Problemumgehung besteht darin, den generierten Code (die TLH-Datei) manuell einer #include Direktive in die Headerdatei hinzuzufügen.
Stellen Sie sicher, dass Der Klassen-Designer den eingegebenen Typ unterstützt. Siehe Einschränkungen für C++-Codeelemente.
Der am häufigsten auftretende Fehler bei einem Typauflösungsproblem lautet Code konnte für ein oder mehrere Formen im Klassendiagramm "<Element>" nicht gefunden werden. Diese Fehlermeldung weist nicht unbedingt darauf hin, dass ihr Code fehlerhaft ist. Es gibt nur an, dass der Klassendesigner Ihren Code nicht anzeigen konnte. Probieren Sie die folgenden Maßnahmen aus:
Stellen Sie sicher, dass der Typ vorhanden ist. Stellen Sie sicher, dass Sie den Quellcode nicht versehentlich auskommentiert oder gelöscht haben.
Versuchen Sie, den Typ aufzulösen. Der Typ befindet sich möglicherweise in einem Projekt oder einer Assembly, auf das nicht aus dem Projekt verwiesen wird, das das Klassendiagramm enthält. Um diesen Fehler zu beheben, fügen Sie einen Verweis auf das Projekt oder die Assembly hinzu, das den Typ enthält. Weitere Informationen finden Sie unter Verwalten von Verweisen in einem Projekt.
Stellen Sie sicher, dass sich der Typ im richtigen Bereich befindet, damit der Klassen-Designer ihn finden kann. Stellen Sie sicher, dass dem Code keine
using,importsoder#includeAnweisung fehlt. Stellen Sie außerdem sicher, dass Sie den Typ (oder einen verwandten Typ) nicht aus dem Namespace verschoben haben, in dem er sich ursprünglich befand.
Tipp
Weitere Informationen zur Problembehandlung finden Sie unter Class Designer-Fehler.