Werken met C++-code in Class Designer

Class Designer geeft een visueel ontwerpoppervlak weer dat een klassediagram wordt genoemd dat een visuele weergave biedt van de code-elementen in uw project. U kunt klassediagrammen gebruiken om klassen en andere typen in een project te ontwerpen en te visualiseren.

Class Designer ondersteunt de volgende C++-code-elementen:

  • Klasse (lijkt op een vorm van een beheerde klasse, behalve dat het meerdere overervingsrelaties kan hebben)

  • Anonieme klasse (geeft de gegenereerde naam van de klasseweergave weer voor het anonieme type)

  • Sjabloonklasse

  • Structuur

  • Enum

  • Macro (geeft de naverwerkte weergave van de macro weer)

  • Typedef

Opmerking

Dit is niet hetzelfde als het UML-klassediagram, dat u in een modelproject kunt maken. Zie UML-klassediagrammen: Naslaginformatie voor meer informatie.

C++-klassen in Class Designer

Class Designer ondersteunt C++-klassen en visualiseert systeemeigen C++-klassen op dezelfde manier als Visual Basic- en C#-klassenshapes, behalve dat C++-klassen meerdere overnamerelaties kunnen hebben. U kunt de klasvorm uitbreiden om meer velden en methoden in de klasse zichtbaar te maken, of samenvoegen om ruimte te besparen.

Opmerking

Class Designer biedt geen ondersteuning voor unions (een speciaal type klasse waarin het toegewezen geheugen alleen de hoeveelheid is die nodig is voor het grootste gegevenslid van de unie).

Eenvoudige overname

Wanneer u meer dan één klasse naar een klassediagram sleept en de klassen een klassenovernamerelatie hebben, verbindt een pijl deze. De pijl wijst in de richting van de basisklasse. Wanneer de volgende klassen bijvoorbeeld worden weergegeven in een klassediagram, verbindt een pijl deze, die van B naar A wijst:

class A {};
class B : A {};

U kunt ook alleen klasse B naar het klassediagram slepen, met de rechtermuisknop op de klasseshape voor B klikken en vervolgens op Basisklassen weergeven klikken. Hiermee wordt de basisklasse weergegeven: A.

Meervoudige overerving

Class Designer ondersteunt de visualisatie van overnamerelaties met meerdere klassen. Meervoudige overerving wordt toegepast wanneer een afgeleide klasse attributen van meer dan één basisklasse heeft. Hier volgt een voorbeeld van meerdere overnames:

class Bird {};
class Swimmer {};
class Penguin : public Bird, public Swimmer {};

Wanneer u meer dan één klasse naar het klassediagram sleept en de klassen een overnamerelatie met meerdere klassen hebben, worden deze met een pijl verbonden. De pijl wijst in de richting van de basisklassen.

Als u met de rechtermuisknop op een klasseshape klikt en vervolgens op Basisklassen weergeven klikt, worden de basisklassen voor de geselecteerde klasse weergegeven.

Opmerking

De opdracht Afgeleide klassen weergeven wordt niet ondersteund voor C++-code. U kunt afgeleide klassen weergeven door naar klasseweergave te gaan, het typeknooppunt uit te vouwen, de submap Afgeleide typen uit te vouwen en deze typen vervolgens naar het klassediagram te slepen.

Zie Meervoudige Klasse-erfenis en Meervoudige Basisklassen voor meer informatie over overerving van meerdere klassen.

Abstracte klassen

Class Designer ondersteunt abstracte klassen (ook wel abstracte basisklassen genoemd). Dit zijn klassen die u nooit instantiëren, maar waaruit u andere klassen kunt afleiden. Met behulp van een voorbeeld van 'Meerdere overerving' eerder in dit document, kunt u de Bird klasse instantiëren als afzonderlijke objecten als volgt:

int main()
{
   Bird sparrow;
   Bird crow;
   Bird eagle;
}

Het is echter mogelijk dat u de Swimmer klasse niet wilt instantiëren als afzonderlijke objecten. Misschien bent u alleen van plan om andere soorten dierklassen ervan af te leiden, bijvoorbeeld Penguin, Whaleen Fish. In dat geval declareert u de Swimmer klasse als een abstracte basisklasse.

Als u een klasse als abstract wilt declareren, kunt u het abstract trefwoord gebruiken. Leden die zijn gemarkeerd als abstract of opgenomen in een abstracte klasse, zijn virtueel en moeten worden geïmplementeerd door klassen die zijn afgeleid van de abstracte klasse.

class Swimmer abstract
{
   virtual void swim();
   void dive();
};

U kunt een klasse ook declareren als abstract door ten minste één pure virtuele functie op te geven:

class Swimmer
{
   virtual void swim() = 0;
   void dive();
};

Wanneer u deze declaraties weergeeft in een klassediagram, worden de klassenaam Swimmer en de pure virtuele functie swim ervan in cursief weergegeven in een abstracte klassevorm, samen met de abstracte klasseklasse. U ziet dat de vorm van het abstracte klassetype hetzelfde is als die van een normale klasse, behalve dat de rand een stippellijn is.

Een klasse die is afgeleid van een abstracte basisklasse, moet elke pure virtuele functie in de basisklasse overschrijven of de afgeleide klasse kan niet worden geïnstantieerd. Als u bijvoorbeeld een Fish klasse van de Swimmer klasse afleidt, Fish moet u de swim methode overschrijven:

class Fish : public Swimmer
{
   void swim(int speed);
};

int main()
{
   Fish guppy;
}

Wanneer u deze code in een klassediagram weergeeft, tekent Class Designer een overnameregel van Fish naar Swimmer.

Anonieme klassen

Class Designer ondersteunt anonieme klassen. Anonieme klassetypen zijn klassen die zonder id zijn gedeclareerd. Ze kunnen geen constructor of destructor hebben, kunnen niet worden doorgegeven als argumenten voor functies en kunnen niet worden geretourneerd als retourwaarden van functies. U kunt een anonieme klasse gebruiken om een klassenaam te vervangen door een typedef-naam, zoals in het volgende voorbeeld:

typedef struct
{
    unsigned x;
    unsigned y;
} POINT;

Structuren kunnen ook anoniem zijn. Class Designer geeft anonieme klassen en structuren weer die hetzelfde zijn als het betreffende type. Hoewel u anonieme klassen en structuren kunt declareren en weergeven, gebruikt Class Designer niet de tagnaam die u opgeeft. Het zal de naam gebruiken die door de Klasseweergave is gegenereerd. De klasse of structuur wordt weergegeven in de klasseweergave en Class Designer als een element dat __unnamed wordt genoemd.

Zie Anonieme klassetypen voor meer informatie over anonieme klassen.

Sjabloonklassen

Class Designer ondersteunt de visualisatie van sjabloonklassen. Geneste declaraties worden ondersteund. In de volgende tabel ziet u enkele typische declaraties.

Code-element Class Designer-weergave
template <class T>

class A {};
A<T>

Sjabloonklasse
template <class T, class U>

class A {};
A<T, U>

Sjabloonklasse
template <class T, int i>

class A {};
A<T, i>

Sjabloonklasse
template <class T, template <class K> class U>

class A {};
A<T, U>

Sjabloonklasse

In de volgende tabel ziet u enkele voorbeelden van gedeeltelijke specialisatie.

Code-element Class Designer-weergave
template<class T, class U>

class A {};
A<T, U>

Sjabloonklasse
template<class T>

class A<T, T> {};
A<T, T>

Sjabloonklasse
template <class T>

class A<T, int> {};
A<T, int>

Sjabloonklasse
template <class T1, class T2>

class A<T1*, T2*> {};
A<T1*, T2*>

Sjabloonklasse

In de volgende tabel ziet u enkele voorbeelden van overname in gedeeltelijke specialisatie.

Code-element Class Designer-weergave
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>

Sjabloonklasse

B

Class

(verwijst naar klasse A)

C

Class

(verwijst naar klasse A)

In de volgende tabel ziet u enkele voorbeelden van gedeeltelijke specialisatiesjabloonfuncties.

Code-element Class Designer-weergave
class A

{

template <class T, class U>

void func(T a, U b);

template <class T>

void func(T a, int b);

};
A

func<T, U> (+ 1 overbelasting)
template <class T1>

class A {

template <class T2>

class B {};

};

template<> template<>

class A<type>::B<type> {};
A<T1>

Sjabloonklasse

B<T2>

Sjabloonklasse

(B bevindt zich in klasse A onder Geneste typen)
template <class T>

class C {};

class A : C<int> {};
A

Class

-> C<int>

C<T>

Sjabloonklasse

In de volgende tabel ziet u enkele voorbeelden van de overname van sjablonen.

Code-element Class Designer-weergave
template <class T>

class C {};

template<>

class C<int> {

class B {};

}

class A : C<int>::B {};
A

Class

->B

C<int>

Class

(B bevindt zich in klasse C onder Genestetype)

C<T>

Sjabloonklasse

In de volgende tabel ziet u enkele voorbeelden van canonieke gespecialiseerde klasseverbinding.

Code-element Class Designer-weergave
template <class T>

class C {};

template<>

class C<int> {};

class A : C<int> {};

class D : C<float> {};
A

Class

->C<int>

C<int>

Class

C<T>

Sjabloonklasse

D

Class

->C<float>
class B {

template <class T>

T min (const T &a, const T &b);

};
B

min <T>

C++ opsommingen in Class Designer

Class Designer ondersteunt C++ enum en scoped enum class typen. Hier volgt een voorbeeld:

enum CardSuit {
   Diamonds = 1,
   Hearts = 2,
   Clubs = 3,
   Spades = 4
};

// or...
enum class CardSuit {
   Diamonds = 1,
   Hearts = 2,
   Clubs = 3,
   Spades = 4
};

Een C++-opsommingsshape in een klassediagram ziet eruit en werkt als een structuurshape, behalve dat het label Enum - of Enum-klasse leest, is deze roze in plaats van blauw en heeft een gekleurde rand aan de linkerkant en bovenmarges. Zowel opsommingsvormen als structuurvormen hebben vierkante hoeken.

Zie enum voor meer informatie over het gebruik van het type.

C++ typedefs in Class Designer

Typedef-instructies maken een of meer lagen van indirectie tussen een naam en het onderliggende type. Class Designer ondersteunt C++ typedef-typen, die worden gedeclareerd met het trefwoord typedef, bijvoorbeeld:

typedef class coord
{
   void P(x,y);
   unsigned x;
   unsigned y;
} COORD;

Vervolgens kunt u dit type gebruiken om een exemplaar te declareren:

COORD OriginPoint;

Klassen- en structuren-vormen

In Class Designer heeft een C++-typedef de vorm van het type dat is opgegeven in de typedef. Als de bron typedef class declareert, heeft de vorm afgeronde hoeken en het label Class. De typedef structshape heeft vierkante hoeken en de label Struct.

Klassen en structuren kunnen geneste typedefs hebben die erin zijn gedeclareerd. In Class Designer kunnen klasse- en structuurshapes geneste typedef-declaraties weergeven als geneste vormen.

Typedef-vormen ondersteunen de opdrachten Weergeven als koppeling en Weergeven als verzamelingskoppeling in het snelmenu (contextmenu).

Voorbeeld van klassetypedef

class B {};
typedef B MyB;

C++-klassetypedef in Class Designer

Voorbeeld van Struct typedef

typedef struct mystructtag
{
    int   i;
    double f;
} mystruct;

C++ struct typedef in Class Designer

Niet-benoemde typedefs

Hoewel u een typedef zonder naam kunt declareren, gebruikt Class Designer niet de tagnaam die u opgeeft. Class Designer gebruikt de naam die klasseweergave genereert. De volgende declaratie is bijvoorbeeld geldig, maar wordt weergegeven in klasseweergave en klasseontwerper als een object met de naam __unnamed:

typedef class coord
{
   void P(x,y);
   unsigned x;
   unsigned y;
};

Opmerking

Class Designer geeft geen typedefs weer waarvan het brontype een functiepointer is.

Meer informatie over beperkingen voor C++-code-elementen

  • Wanneer een C++-project wordt geladen, werkt Class Designer op een alleen-lezen manier. U kunt het klassediagram wijzigen, maar u kunt geen wijzigingen van het klassediagram weer opslaan in de broncode.

  • Class Designer ondersteunt alleen systeemeigen C++-semantiek. Voor C++-projecten die zijn gecompileerd in beheerde code, visualiseert Class Designer alleen code-elementen die systeemeigen typen zijn. Daarom kunt u een klassediagram toevoegen aan een project, maar met Class Designer kunt u geen elementen visualiseren waarop de IsManaged eigenschap is ingesteld true (dat wil gezegd waardetypen en verwijzingstypen).

  • Voor C++-projecten leest class designer alleen de definitie van het type. Stel dat u een type in een headerbestand (.h) definieert en de leden ervan definieert in een implementatiebestand (.cpp). Als u 'Klassediagram weergeven' aanroept in het implementatiebestand (.cpp), wordt er niets weergegeven in Class Designer . Als u bijvoorbeeld Klassediagram weergeven aanroept op een .cpp-bestand dat gebruikmaakt van een #include instructie om andere bestanden op te nemen, maar geen werkelijke klassedefinities bevat, wordt in Class Designer opnieuw niets weergegeven.

  • IDL-bestanden (.idl) die COM-interfaces en typebibliotheken definiëren, worden niet weergegeven in diagrammen, tenzij ze zijn gecompileerd naar systeemeigen C++-code.

  • Class Designer biedt geen ondersteuning voor globale functies en variabelen.

  • Class Designer biedt geen ondersteuning voor unions. Dit is een speciaal type klasse waarin het toegewezen geheugen alleen de hoeveelheid is die nodig is voor het grootste gegevenslid van de unie.

  • Class Designer geeft geen basisgegevenstypen weer, zoals int en char.

  • Class Designer geeft geen typen weer die buiten het huidige project zijn gedefinieerd als het project geen juiste verwijzingen naar deze typen heeft.

  • Class Designer kan geneste typen weergeven, maar niet de relaties tussen een genest type en andere typen.

  • Class Designer kan geen typen weergeven die ongeldig zijn of die zijn afgeleid van een ongeldig type.

Problemen met typeoplossing en weergave oplossen

Locatie van bronbestanden

Class Designer houdt de locatie van bronbestanden niet bij. Als u daarom de projectstructuur wijzigt of bronbestanden in uw project verplaatst, kan Class Designer het type verliezen (met name het brontype van een typedef, basisklassen of koppelingstypen). Mogelijk treedt er een fout op, zoals Class Designer kan dit type niet weergeven. Als u dit doet, sleept u de gewijzigde of verplaatste broncode opnieuw naar het klassediagram om het opnieuw weer te geven.

Problemen met bijwerken en prestaties

Voor C++-projecten kan het 30 tot 60 seconden duren voordat een wijziging in het bronbestand wordt weergegeven in het klassediagram. Deze vertraging kan ook ertoe leiden dat Class Designer de fout 'Geen typen gevonden' in de selectie genereert. Als u een dergelijke fout ontvangt, klikt u op Annuleren in het foutbericht en wacht u tot het code-element wordt weergegeven in de klasseweergave. Nadat u dit hebt uitgevoerd, moet Class Designer het type kunnen weergeven.

Als een klassediagram niet wordt bijgewerkt met wijzigingen die u in de code hebt aangebracht, moet u het diagram mogelijk sluiten en opnieuw openen.

Problemen met type-resolutie

Class Designer kan mogelijk om de volgende redenen typen niet oplossen:

  • Het type bevindt zich in een project of assembly waarnaar niet wordt verwezen vanuit het project dat het klassediagram bevat. Als u deze fout wilt corrigeren, voegt u een verwijzing toe naar het project of de assembly die het type bevat. Zie Verwijzingen in een project beheren voor meer informatie.

  • Het type bevindt zich niet in het juiste bereik, dus Class Designer kan het niet vinden. Zorg ervoor dat er geen using, imports of #include instructie ontbreekt in de code. Zorg er ook voor dat u het type (of een gerelateerd type) niet hebt verplaatst uit de naamruimte waarin het oorspronkelijk zich bevond.

  • Het type bestaat niet (of is uitgecommentarieerd). Als u deze fout wilt corrigeren, moet u ervoor zorgen dat u het type niet hebt uitgecommentarieerd of verwijderd.

  • Het type bevindt zich in een bibliotheek waarnaar wordt verwezen via een #import-richtlijn. Een mogelijke tijdelijke oplossing is het handmatig toevoegen van de gegenereerde code (het TLH-bestand) aan een #include instructie in het headerbestand.

  • Zorg ervoor dat Class Designer het type ondersteunt dat u hebt ingevoerd. Zie Beperkingen voor C++-code-elementen.

De fout die u waarschijnlijk ziet bij een type oplossingsprobleem is de code niet gevonden voor een of meer vormen in het klassediagram '<element>'. Dit foutbericht geeft niet noodzakelijkerwijs aan dat uw code een fout heeft. Dit geeft alleen aan dat class designer uw code niet kon weergeven. Probeer de volgende metingen:

  • Zorg ervoor dat het type bestaat. Zorg ervoor dat u niet per ongeluk commentaar hebt toegevoegd of dat u de broncode hebt verwijderd.

  • Probeer het type op te lossen. Het type bevindt zich mogelijk in een project of assembly waarnaar niet wordt verwezen vanuit het project dat het klassediagram bevat. Als u deze fout wilt corrigeren, voegt u een verwijzing toe naar het project of de assembly die het type bevat. Zie Verwijzingen in een project beheren voor meer informatie.

  • Zorg ervoor dat het type zich in het juiste bereik bevindt, zodat Class Designer het kan vinden. Zorg ervoor dat er geen using, imports of #include instructie ontbreekt in de code. Zorg er ook voor dat u het type (of een gerelateerd type) niet hebt verplaatst uit de naamruimte waarin het oorspronkelijk zich bevond.

Aanbeveling

Zie Class Designer-fouten voor aanvullende informatie over probleemoplossing.