Práce s kódem C++ v Návrháři tříd
Návrhář tříd zobrazí vizuální návrhovou plochu označovanou jako diagram tříd, který poskytuje vizuální znázornění prvků kódu v projektu. Diagramy tříd můžete použít k návrhu a vizualizaci tříd a dalších typů v projektu.
Návrhář tříd podporuje následující prvky kódu C++:
Třída (podobá se obrazci spravované třídy s tím rozdílem, že může mít více vztahů dědičnosti)
Anonymní třída (zobrazí vygenerovaný název zobrazení třídy pro anonymní typ)
Třída šablony
Struktura
Výčet
Makro (zobrazí zobrazení makra po zpracování)
Typedef
Poznámka:
Není to stejné jako diagram tříd UML, který můžete vytvořit v projektu modelování. Další informace naleznete v tématu Diagramy tříd UML: Referenční informace.
Třídy C++ v Návrháři tříd
Návrhář tříd podporuje třídy C++ a vizualizuje nativní třídy C++ stejným způsobem jako obrazce tříd jazyka Visual Basic a C#, s tím rozdílem, že třídy C++ mohou mít více vztahů dědičnosti. Obrazec třídy můžete rozšířit tak, aby zobrazoval více polí a metod ve třídě, nebo ho sbalit, aby se ušetřilo místo.
Poznámka:
Návrhář tříd nepodporuje sjednocení (speciální typ třídy, ve které je přidělena paměť, pouze množství potřebné pro největšího datového člena sjednocení).
Jednoduchá dědičnost
Když přetáhnete více než jednu třídu do diagramu tříd a třídy mají vztah dědičnosti tříd, šipka je spojí. Šipka ukazuje ve směru základní třídy. Když se například v diagramu tříd zobrazí následující třídy, spojí je šipka, která ukazuje z B na A:
class A {};
class B : A {};
Do diagramu třídy můžete také přetáhnout pouze třídu B, kliknout pravým tlačítkem myši na obrazec třídy pro B a potom kliknout na zobrazit základní třídy. Zobrazí se její základní třída: A.
Vícenásobná dědičnost
Návrhář tříd podporuje vizualizaci vztahů dědičnosti více tříd. Více dědičnosti se používá, pokud odvozená třída má atributy více než jedné základní třídy. Následuje příklad vícenásobné dědičnosti:
class Bird {};
class Swimmer {};
class Penguin : public Bird, public Swimmer {};
Když přetáhnete více než jednu třídu do diagramu tříd a třídy mají vztah dědičnosti více tříd, šipka je spojí. Šipka ukazuje ve směru základních tříd.
Po kliknutí pravým tlačítkem myši na obrazec třídy a po kliknutí na příkaz Zobrazit základní třídy se zobrazí základní třídy pro vybranou třídu.
Poznámka:
Příkaz Zobrazit odvozené třídy není podporován pro kód jazyka C++. Odvozené třídy můžete zobrazit tak, že přejdete do zobrazení třídy, rozbalíte uzel typu, rozbalíte podsložku Odvozené typy a potom tyto typy přetáhnete do diagramu tříd.
Další informace o dědičnosti více tříd naleznete v tématu Více dědičnost a Více základních tříd.
Abstraktní třídy
Návrhář tříd podporuje abstraktní třídy (označované také jako abstraktní základní třídy). Jedná se o třídy, které nikdy neodstraňujete, ale ze kterých můžete odvodit jiné třídy. Pomocí příkladu z "Více dědičnosti" dříve v tomto dokumentu můžete vytvořit instanci Bird
třídy jako jednotlivé objekty následujícím způsobem:
int main()
{
Bird sparrow;
Bird crow;
Bird eagle;
}
Možná ale nebudete chtít vytvořit instanci Swimmer
třídy jako jednotlivé objekty. Můžete mít v úmyslu odvozovat pouze jiné typy tříd zvířat, Penguin
například , , Whale
a Fish
. V takovém případě byste třídu deklarovala Swimmer
jako abstraktní základní třídu.
Chcete-li deklarovat třídu jako abstraktní, můžete použít abstract
klíčové slovo. Členy označené jako abstraktní nebo zahrnuté v abstraktní třídě jsou virtuální a musí být implementovány třídami odvozenými z abstraktní třídy.
class Swimmer abstract
{
virtual void swim();
void dive();
};
Třídu můžete také deklarovat jako abstraktní zahrnutím alespoň jedné čistě virtuální funkce:
class Swimmer
{
virtual void swim() = 0;
void dive();
};
Když tyto deklarace zobrazíte v diagramu tříd, název Swimmer
třídy a jeho čistě virtuální funkce swim
se zobrazí v kurzívě v abstraktním obrazci třídy spolu s notací Abstraktní třída. Všimněte si, že obrazec abstraktního typu třídy je stejný jako obrazec normální třídy s tím rozdílem, že jeho ohraničení je tečkovaná čára.
Třída odvozená z abstraktní základní třídy musí přepsat každou čistě virtuální funkci v základní třídě nebo odvozenou třídu nelze vytvořit instanci. Pokud například odvozujete Fish
třídu z Swimmer
třídy, Fish
musí přepsat metodu swim
:
class Fish : public Swimmer
{
void swim(int speed);
};
int main()
{
Fish guppy;
}
Když tento kód zobrazíte v diagramu tříd, Návrhář tříd nakreslí čáru dědičnosti z Fish
do Swimmer
.
Anonymní třídy
Návrhář tříd podporuje anonymní třídy. Anonymní typy tříd jsou třídy deklarované bez identifikátoru. Nemohou mít konstruktor nebo destruktor, nelze je předat jako argumenty funkcím a nelze je vrátit jako návratové hodnoty z funkcí. Anonymní třídu můžete použít k nahrazení názvu třídy názvem typedef, jako v následujícím příkladu:
typedef struct
{
unsigned x;
unsigned y;
} POINT;
Struktury mohou být také anonymní. Návrhář tříd zobrazuje anonymní třídy a struktury stejné jako u příslušného typu. I když můžete deklarovat a zobrazovat anonymní třídy a struktury, Návrhář tříd nebude používat zadaný název značky. Použije název, který vygeneruje zobrazení tříd. Třída nebo struktura se zobrazí v zobrazení třídy a Návrhář tříd jako prvek s názvem __unnamed.
Další informace o anonymních třídách naleznete v tématu Anonymní typy tříd.
Třídy šablon
Návrhář tříd podporuje vizualizaci tříd šablon. Podporují se vnořené deklarace. Následující tabulka uvádí některé typické deklarace.
Prvek kódu | Zobrazení Návrhář tříd |
---|---|
template <class T> class A {}; |
A<T> Třída šablony |
template <class T, class U> class A {}; |
A<T, U> Třída šablony |
template <class T, int i> class A {}; |
A<T, i> Třída šablony |
template <class T, template <class K> class U> class A {}; |
A<T, U> Třída šablony |
Následující tabulka uvádí několik příkladů částečné specializace.
Prvek kódu | Zobrazení Návrhář tříd |
---|---|
template<class T, class U> class A {}; |
A<T, U> Třída šablony |
template<class T> class A<T, T> {}; |
A<T, T> Třída šablony |
template <class T> class A<T, int> {}; |
A<T, int> Třída šablony |
template <class T1, class T2> class A<T1*, T2*> {}; |
A<T1*, T2*> Třída šablony |
Následující tabulka uvádí některé příklady dědičnosti v částečné specializaci.
Prvek kódu | Zobrazení Návrhář tříd |
---|---|
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> Třída šablony B Třída (odkazuje na třídu A) C Třída (odkazuje na třídu A) |
Následující tabulka uvádí některé příklady částečných funkcí šablon specializace.
Prvek kódu | Zobrazení Návrhář tříd |
---|---|
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 přetížení) |
template <class T1> class A { template <class T2> class B {}; }; template<> template<> class A<type>::B<type> {}; |
A<T1> Třída šablony B<T2> Třída šablony (B je obsažen v rámci třídy A v části Vnořené typy) |
template <class T> class C {}; class A : C<int> {}; |
A Třída -> C<int> C<T> Třída šablony |
Následující tabulka uvádí některé příklady dědičnosti šablon.
Prvek kódu | Zobrazení Návrhář tříd |
---|---|
template <class T> class C {}; template<> class C<int> { class B {}; } class A : C<int>::B {}; |
A Třída ->B C<int> Třída (B je obsažen v rámci třídy C v části Vnořené typy) C<T> Třída šablony |
Následující tabulka uvádí některé příklady kanonického specializovaného připojení třídy.
Prvek kódu | Zobrazení Návrhář tříd |
---|---|
template <class T> class C {}; template<> class C<int> {}; class A : C<int> {}; class D : C<float> {}; |
A Třída ->C<int> C<int> Třída C<T> Třída šablony D Třída ->C<float> |
class B { template <class T> T min (const T &a, const T &b); }; |
B min <T> |
Výčty jazyka C++ v Návrháři tříd
Návrhář tříd podporuje typy C++ enum
a vymezené enum class
typy. Následuje příklad:
enum CardSuit {
Diamonds = 1,
Hearts = 2,
Clubs = 3,
Spades = 4
};
// or...
enum class CardSuit {
Diamonds = 1,
Hearts = 2,
Clubs = 3,
Spades = 4
};
Obrazec výčtu jazyka C++ v diagramu tříd vypadá a funguje jako obrazec struktury s tím rozdílem, že popisek čte výčtu nebo výčtu, je růžový místo modré a má barevné ohraničení na levém a horním okraji. Obrazce výčtu i obrazce struktury mají čtvercové rohy.
Další informace o použití enum
typu naleznete v tématu Výčty.
Definice typedef jazyka C++ v Návrháři tříd
Příkazy Typedef vytvářejí jednu nebo více vrstev nepřímého rozdělení mezi názvem a jeho základním typem. Návrhář tříd podporuje typy typedef jazyka C++, které jsou deklarovány klíčovým slovem typedef
, například:
typedef class coord
{
void P(x,y);
unsigned x;
unsigned y;
} COORD;
Tento typ pak můžete použít k deklaraci instance:
COORD OriginPoint;
Obrazce tříd a struktur
V Návrháři tříd má typedef jazyka C++ tvar typu zadaného v typedef. Pokud zdroj deklarujetypedef class
, obrazec má zaoblené rohy a třídu popisku. Obrazec typedef struct
má čtvercové rohy a strukturu popisku.
Třídy a struktury můžou mít vnořené definice typedef deklarované v rámci nich. V Návrháři tříd můžou obrazce třídy a struktury zobrazovat vnořené deklarace typedef jako vnořené obrazce.
Tvary Typedef podporují příkazy Zobrazit jako přidružení a Zobrazit jako přidružení kolekce v místní nabídce (místní nabídka).
Příklad typedef třídy
class B {};
typedef B MyB;
Příklad typedef struktury
typedef struct mystructtag
{
int i;
double f;
} mystruct;
Nepojmenované definice typedef
I když můžete deklarovat typedef bez názvu, Návrhář tříd nepoužívá zadaný název značky. Návrhář tříd používá název, který generuje zobrazení tříd. Například následující deklarace je platná, ale zobrazí se v Zobrazení třídy a Návrhář tříd jako objekt s názvem __unnamed:
typedef class coord
{
void P(x,y);
unsigned x;
unsigned y;
};
Poznámka:
Návrhář tříd nezobrazuje definice typedef, jejichž zdrojovým typem je ukazatel funkce.
Informace o omezeních elementů kódu jazyka C++
Při načtení projektu C++, Návrhář tříd funguje jen pro čtení. Diagram tříd můžete změnit, ale změny z diagramu tříd nelze uložit zpět do zdrojového kódu.
Návrhář tříd podporuje pouze nativní sémantiku jazyka C++. Pro projekty C++, které jsou zkompilovány do spravovaného kódu, Návrhář tříd vizualizuje pouze prvky kódu, které jsou nativními typy. Proto můžete do projektu přidat diagram tříd, ale Návrhář tříd neumožňuje vizualizovat prvky, na kterých
IsManaged
je vlastnost nastavenatrue
(to znamená typy hodnot a odkazové typy).V případě projektů C++ návrhář tříd čte pouze definici typu. Předpokládejme například, že definujete typ v souboru hlavičky (.h) a definujete jeho členy v souboru implementace (.cpp). Pokud v souboru implementace (.cpp) vyvoláte "Zobrazit diagram tříd", Návrhář tříd nezobrazí nic. Jako další příklad, pokud vyvoláte "View Class Diagram" v souboru .cpp, který používá
#include
příkaz k zahrnutí jiných souborů, ale neobsahuje žádné skutečné definice třídy, Návrhář tříd znovu nezobrazí nic.Soubory IDL (.idl), které definují rozhraní MODELU COM a knihovny typů, se nezobrazují v diagramech, pokud nejsou kompilovány do nativního kódu C++.
Návrhář tříd nepodporuje globální funkce a proměnné.
Návrhář tříd nepodporuje sjednocení. Jedná se o speciální typ třídy, ve které je přidělena paměť, pouze množství potřebné pro největšího datového člena sjednocení.
Návrhář tříd nezobrazuje základní datové typy, například
int
achar
.Návrhář tříd nezobrazuje typy definované mimo aktuální projekt, pokud projekt nemá správné odkazy na tyto typy.
Návrhář tříd může zobrazit vnořené typy, ale ne vztahy mezi vnořeným typem a jinými typy.
Návrhář tříd nemůže zobrazit typy, které jsou void nebo které jsou odvozeny od typu void.
Řešení potíží s řešením typů a zobrazením
Umístění zdrojových souborů
Návrhář tříd nesleduje umístění zdrojových souborů. Proto pokud upravíte strukturu projektu nebo přesunete zdrojové soubory v projektu, Návrhář tříd může ztratit přehled o typu (zejména zdrojový typ typedef, základní třídy nebo typy přidružení). Může se zobrazit chyba, jako je návrhář tříd, nemůže zobrazit tento typ. Pokud to uděláte, přetáhněte upravený nebo přemísťovaný zdrojový kód do diagramu tříd znovu a znovu ho zobrazte.
Problémy s aktualizací a výkonem
U projektů C++ může trvat 30 až 60 sekund, než se změna zdrojového souboru zobrazí v diagramu tříd. Toto zpoždění může také způsobit , že Návrhář tříd vyvolá chybu Žádné typy nebyly nalezeny ve výběru. Pokud se zobrazí například chyba, klepněte v chybové zprávě na tlačítko Storno a počkejte, až se prvek kódu zobrazí v zobrazení třídy. Jakmile to uděláte, návrhář tříd by měl být schopen zobrazit typ.
Pokud se diagram tříd neaktualizuje změnami, které jste v kódu provedli, možná budete muset diagram zavřít a znovu ho otevřít.
Problémy s řešením typů
Návrhář tříd nemusí být schopen přeložit typy z následujících důvodů:
Typ je v projektu nebo sestavení, na který se neodkazuje z projektu, který obsahuje diagram tříd. Chcete-li tuto chybu opravit, přidejte odkaz na projekt nebo sestavení obsahující typ. Další informace naleznete v tématu Správa odkazů v projektu.
Typ není ve správném oboru, takže ho Návrhář tříd nemůže najít. Ujistěte se, že kód neobsahuje
using
znak ,imports
nebo#include
příkaz. Také se ujistěte, že jste nepřesunuli typ (nebo související typ) z oboru názvů, ve kterém byl původně umístěn.Typ neexistuje (nebo byl zakomentován). Chcete-li tuto chybu opravit, ujistěte se, že jste typ neodkomentovali nebo odstranili.
Typ se nachází v knihovně odkazované direktivou #import. Možným alternativním řešením je ruční přidání vygenerovaného kódu (souboru .tlh) do direktivy #include do hlavičkového souboru.
Ujistěte se, že Návrhář tříd podporuje zadaný typ. Viz Omezení pro elementy kódu jazyka C++.
Chyba, kterou pravděpodobně uvidíte u problému s řešením typu, není možné najít kód pro jeden nebo více obrazců v diagramu< tříd element>. Tato chybová zpráva nemusí nutně znamenat, že váš kód je chybný. Označuje pouze, že návrhář tříd nemohl zobrazit váš kód. Vyzkoušejte následující míry:
Ujistěte se, že typ existuje. Ujistěte se, že jste neúmyslně neodkomentovali nebo odstranili zdrojový kód.
Pokuste se typ vyřešit. Typ může být v projektu nebo sestavení, na který se neodkazuje z projektu, který obsahuje diagram tříd. Chcete-li tuto chybu opravit, přidejte odkaz na projekt nebo sestavení obsahující typ. Další informace naleznete v tématu Správa odkazů v projektu.
Ujistěte se, že typ je ve správném oboru, aby ho Návrhář tříd mohl najít. Ujistěte se, že kód chybí
using
,imports
nebo#include
příkaz. Také se ujistěte, že jste nepřesunuli typ (nebo související typ) z oboru názvů, ve kterém byl původně umístěn.
Tip
Další informace o řešení potíží najdete v tématu Chyby Návrháře tříd.