Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Klassdesignern visar en visuell designyta som kallas ett klassdiagram som ger en visuell representation av kodelementen i projektet. Du kan använda klassdiagram för att utforma och visualisera klasser och andra typer i ett projekt.
Class Designer stöder följande C++-kodelement:
Klass (liknar en hanterad klassform, förutom att den kan ha flera arvsrelationer)
Anonym klass (visar klassvyns genererade namn för den anonyma typen)
Mallklass
Struktur
Enum
Makro (visar den efterbearbetade vyn av makrot)
Typedef
Anmärkning
Detta är inte samma som UML-klassdiagrammet, som du kan skapa i ett modelleringsprojekt. Mer information finns i UML-klassdiagram: Referens.
C++-klasser i Klassdesignern
Klassdesignern stöder C++-klasser och visualiserar interna C++-klasser på samma sätt som Visual Basic- och C#-klassformer, förutom att C++-klasser kan ha flera arvsrelationer. Du kan expandera klassformen för att visa fler fält och metoder i klassen eller komprimera den för att spara utrymme.
Anmärkning
Klassdesignern stöder inte fackföreningar (en särskild typ av klass där det tilldelade minnet endast är den mängd som krävs för unionens största datamedlem).
Enkel arv
När du drar mer än en klass till ett klassdiagram, och klasserna har ett arvsförhållande, ansluter dem en pil. Pilen pekar i basklassens riktning. När till exempel följande klasser visas i ett klassdiagram ansluter en pil dem och pekar från B till A:
class A {};
class B : A {};
Du kan också bara dra klass B till klassdiagrammet, högerklicka på klassformen för B och sedan klicka på Visa basklasser. Detta visar basklassen: A.
Flera arv
Klassdesignern stöder visualisering av arvsrelationer med flera klasser. Flera arv används när en härledd klass har attribut av mer än en basklass. Följande är ett exempel på flera arv:
class Bird {};
class Swimmer {};
class Penguin : public Bird, public Swimmer {};
När du drar mer än en klass till klassdiagrammet och klasserna har en arvsrelation med flera klasser ansluter en pil dem. Pilen pekar i riktning mot basklasserna.
Om du högerklickar på en klassform och sedan klickar på Visa basklasser visas basklasserna för den valda klassen.
Anmärkning
Kommandot Visa härledda klasser stöds inte för C++-kod. Du kan visa härledda klasser genom att gå till Klassvy, expandera typnoden, expandera undermappen Härledda typer och sedan dra dessa typer till klassdiagrammet.
Mer information om arv med flera klasser finns i Flera arv och flera basklasser.
Abstrakta klasser
Class Designer stöder abstrakta klasser (även kallade "abstrakta basklasser"). Det här är klasser som du aldrig instansierar, men som du kan härleda andra klasser från. Med ett exempel från "Flera arv" tidigare i det här dokumentet kan du instansiera Bird klassen som enskilda objekt på följande sätt:
int main()
{
Bird sparrow;
Bird crow;
Bird eagle;
}
Du kanske dock inte tänker instansiera Swimmer klassen som enskilda objekt. Du kanske bara tänker härleda andra typer av djurklasser från den, till exempel Penguin, Whaleoch Fish. I så fall deklarerar Swimmer du klassen som en abstrakt basklass.
Om du vill deklarera en klass som abstrakt kan du använda nyckelordet abstract . Medlemmar som har markerats som abstrakta eller ingår i en abstrakt klass är virtuella och måste implementeras av klasser som härleds från den abstrakta klassen.
class Swimmer abstract
{
virtual void swim();
void dive();
};
Du kan också deklarera en klass som abstrakt genom att inkludera minst en ren virtuell funktion:
class Swimmer
{
virtual void swim() = 0;
void dive();
};
När du visar dessa deklarationer i ett klassdiagram visas klassnamnet Swimmer och dess rena virtuella funktion swim i kursiv stil i en abstrakt klassform, tillsammans med notationen Abstrakt klass. Observera att den abstrakta klasstypsformen är samma som för en vanlig klass, förutom att dess kantlinje är en streckad linje.
En klass som härleds från en abstrakt basklass måste åsidosätta varje ren virtuell funktion i basklassen, annars kan inte den härledda klassen instansieras. Om du till exempel skapar en Fish-klass som ärver från en Swimmer-klass, måste Fish åsidosätta swim-metoden.
class Fish : public Swimmer
{
void swim(int speed);
};
int main()
{
Fish guppy;
}
När du visar den här koden i ett klassdiagram ritar Klassdesignern en arvslinje från Fish till Swimmer.
Anonyma klasser
Klassdesignern stöder anonyma klasser. Anonyma klasstyper är klasser som deklareras utan identifierare. De kan inte ha en konstruktor eller destruator, kan inte skickas som argument till funktioner och kan inte returneras som returvärden från funktioner. Du kan använda en anonym klass för att ersätta ett klassnamn med ett typedef-namn, som i följande exempel:
typedef struct
{
unsigned x;
unsigned y;
} POINT;
Strukturer kan också vara anonyma. Klassdesignern visar anonyma klasser och strukturer på samma sätt som den visar respektive typ. Även om du kan deklarera och visa anonyma klasser och strukturer använder klassdesignern inte taggnamnet som du anger. Den använder det namn som klassvyn genererar. Klassen eller strukturen visas i klassvyn och klassdesignern som ett element som heter __unnamed.
Mer information om anonyma klasser finns i Anonyma klasstyper.
Mallklasser
Class Designer stöder visualisering av mallklasser. Kapslade deklarationer stöds. I följande tabell visas några typiska deklarationer.
| Kodelement | Klassdesignervy |
|---|---|
template <class T>class A {}; |
A<T>Mallklass (Template Class) |
template <class T, class U>class A {}; |
A<T, U>Mallklass |
template <class T, int i>class A {}; |
A<T, i>Mallklass |
template <class T, template <class K> class U>class A {}; |
A<T, U>Mallklass |
I följande tabell visas några exempel på partiell specialisering.
| Kodelement | Klassdesignervy |
|---|---|
template<class T, class U>class A {}; |
A<T, U>Mallklass |
template<class T>class A<T, T> {}; |
A<T, T>Mallklass |
template <class T>class A<T, int> {}; |
A<T, int>Template-klass |
template <class T1, class T2>class A<T1*, T2*> {}; |
A<T1*, T2*>Mallklass |
I följande tabell visas några exempel på arv i partiell specialisering.
| Kodelement | Klassdesignervy |
|---|---|
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>Mallklass BClass (pekar på klass A) CClass (pekar på klass A) |
I följande tabell visas några exempel på funktioner för partiell specialiseringsmall.
| Kodelement | Klassdesignervy |
|---|---|
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 överlagring) |
template <class T1>class A {template <class T2>class B {};};template<> template<>class A<type>::B<type> {}; |
A<T1>Mallklass B<T2>Mallklass (B är i klass A under Kapslade typer) |
template <class T>class C {};class A : C<int> {}; |
AClass -> C<int> C<T>Templatklass |
I följande tabell visas några exempel på arv av mallarv.
| Kodelement | Klassdesignervy |
|---|---|
template <class T>class C {};template<>class C<int> {class B {};}class A : C<int>::B {}; |
AClass ->B C<int>Class (B är innesluten i klass C under Kapslade typer) C<T>Mallklass |
I följande tabell visas några exempel på kanonisk specialiserad klassanslutning.
| Kodelement | Klassdesignervy |
|---|---|
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>Mallklass DClass ->C<float> |
class B {template <class T>T min (const T &a, const T &b);}; |
Bmin <T> |
C++-uppräkningar i klassdesignern
Class Designer har stöd för C++ enum och begränsade enum class typer. Följande är ett exempel:
enum CardSuit {
Diamonds = 1,
Hearts = 2,
Clubs = 3,
Spades = 4
};
// or...
enum class CardSuit {
Diamonds = 1,
Hearts = 2,
Clubs = 3,
Spades = 4
};
En C++-enum-form i ett klassdiagram ser ut och fungerar som en strukturform, förutom att etiketten visar Enum eller Enum class, den är rosa i stället för blå och har en färgad kantlinje till vänster och den övre marginalen. Både uppräkningsformer och strukturformer har fyrkantiga hörn.
Mer information om hur du använder enum typen finns i Uppräkningar.
C++ typedefs i Class Designer
Typedef-instruktioner skapar ett eller flera lager av indirektion mellan ett namn och dess underliggande typ.
Class Designer har stöd för typer av C++typedef, som deklareras med nyckelordet typedef, till exempel:
typedef class coord
{
void P(x,y);
unsigned x;
unsigned y;
} COORD;
Du kan sedan använda den här typen för att deklarera en instans:
COORD OriginPoint;
Klass- och structformer
I Klassdesignern har en C++ typedef formen av den typ som anges i typedef. Om källan deklarerar typedef classhar formen rundade hörn och etiketten Klass. För typedef structhar formen fyrkantiga hörn och etiketten Struct.
Klasser och strukturer kan ha kapslade typedefs deklarerade i dem. I Klassdesignern kan klass- och strukturformer visa kapslade typedef-deklarationer som kapslade former.
Typedef-former stöder kommandona Visa som association och Visa som samlingsassociation på snabbmenyn.
Exempel på klasstypdef
class B {};
typedef B MyB;
Struktur typedef-exempel
typedef struct mystructtag
{
int i;
double f;
} mystruct;
Namnlösa typedefs
Även om du kan deklarera en typedef utan namn använder klassdesignern inte det taggnamn som du anger. Klassdesignern använder det namn som klassvyn genererar. Följande deklaration är till exempel giltig, men den visas i Klassvy och Klassdesigner som ett objekt med namnet __unnamed:
typedef class coord
{
void P(x,y);
unsigned x;
unsigned y;
};
Anmärkning
Klassdesignern visar inte typedefs vars källtyp är en funktionspekare.
Lär dig mer om begränsningar för C++-kodelement
När ett C++-projekt läses in, fungerar Class Designer i skrivskyddat läge. Du kan ändra klassdiagrammet, men du kan inte spara ändringar från klassdiagrammet tillbaka till källkoden.
Class Designer stöder endast inbyggda C++-semantik. För C++-projekt som kompileras till hanterad kod visualiserar Class Designer endast kodelement som är inbyggda typer. Därför kan du lägga till ett klassdiagram i ett projekt, men klassdesignern tillåter inte att du visualiserar element som
IsManagedegenskapen är inställdtruepå (det vill: värdetyper och referenstyper).För C++-projekt läser klassdesignern endast definitionen av typen. Anta till exempel att du definierar en typ i en rubrikfil (.h) och definierar dess medlemmar i en implementeringsfil (.cpp). Om du anropar "Visa klassdiagram" på implementeringsfilen (.cpp) visas ingenting i Klassdesignern . Om du till exempel anropar "Visa klassdiagram" på en .cpp fil som använder en
#include-instruktion för att inkludera andra filer men inte innehåller några faktiska klassdefinitioner, visar Klassdesignern ingenting igen.IDL-filer (.idl), som definierar COM-gränssnitt och typbibliotek, visas inte i diagram om de inte kompileras till inbyggd C++-kod.
Klassdesignern stöder inte globala funktioner och variabler.
Klassdesignern stöder inte unioner. Det här är en särskild typ av klass där det tilldelade minnet bara är den mängd som krävs för unionens största datamedlem.
Klassdesignern visar inte grundläggande datatyper som
intochchar.Klassdesignern visar inte typer som definieras utanför det aktuella projektet om projektet inte har rätt referenser till dessa typer.
Klassdesignern kan visa kapslade typer men inte relationerna mellan en kapslad typ och andra typer.
Klassdesignern kan inte visa typer som är ogiltiga eller som härleds från en void-typ.
Felsöka problem med typmatchning och visning
Plats för källfiler
Klassdesignern håller inte reda på källfilernas plats. Om du ändrar projektstrukturen eller flyttar källfiler i projektet kan klassdesignern därför förlora kontrollen över typen (särskilt källtypen för en typdef, basklasser eller associationstyper). Du kan få ett fel som klassdesignern inte kan visa den här typen. Om du gör det drar du den ändrade eller flyttade källkoden till klassdiagrammet igen för att återspela den.
Problem med uppdatering och prestanda
För C++-projekt kan det ta 30 till 60 sekunder innan en ändring i källfilen visas i klassdiagrammet. Den här fördröjningen kan också leda till att Klassdesignern genererar felet Inga typer hittades i markeringen. Om du får ett sådant här fel klickar du på Avbryt i felmeddelandet och väntar tills kodelementet visas i klassvyn. När du har slutfört detta bör klassdesignern kunna visa typen.
Om ett klassdiagram inte uppdateras med ändringar som du har gjort i koden kan du behöva stänga diagrammet och öppna det igen.
Problem med typupplösning
Klassdesignern kanske inte kan lösa typer av följande orsaker:
Typen finns i ett projekt eller en sammansättning som inte refereras från projektet som innehåller klassdiagrammet. Åtgärda det här felet genom att lägga till en referens till projektet eller sammansättningen som innehåller typen. Mer information finns i Hantera referenser i ett projekt.
Typen är inte i rätt omfång, så klassdesignern kan inte hitta den. Kontrollera att koden inte saknar en
using- ,importseller#include-instruktion. Kontrollera också att du inte har flyttat typen (eller en relaterad typ) från namnområdet där den ursprungligen fanns.Typen finns inte (eller har kommenterats ut). Åtgärda det här felet genom att kontrollera att du inte har kommenterat ut eller tagit bort typen.
Typen finns i ett bibliotek som refereras till av ett #import-direktiv. En möjlig lösning är att manuellt lägga till den genererade koden (.tlh-filen) i ett #include-direktiv i huvudfilen.
Kontrollera att Klassdesignern stöder den typ som du angav. Se Begränsningar för C++-kodelement.
Det fel som du troligen ser för ett typmatchningsproblem är att Kod inte kunde hittas för en eller flera former i klassdiagrammet "<element">. Det här felmeddelandet anger inte nödvändigtvis att koden är felaktig. Det anger bara att klassdesignern inte kunde visa koden. Prova följande mått:
Kontrollera att typen finns. Kontrollera att du inte oavsiktligt har kommenterat ut eller tagit bort källkoden.
Försök att lösa typen. Typen kan finnas i ett projekt eller en sammansättning som inte refereras från det projekt som innehåller klassdiagrammet. Åtgärda det här felet genom att lägga till en referens till projektet eller sammansättningen som innehåller typen. Mer information finns i Hantera referenser i ett projekt.
Kontrollera att typen är i rätt omfång så att klassdesignern kan hitta den. Kontrollera att koden inte saknar en
using- ,importseller#include-instruktion. Kontrollera också att du inte har flyttat typen (eller en relaterad typ) från namnområdet där den ursprungligen fanns.
Tips/Råd
Mer felsökningsinformation finns i Klassdesigner-fel.