Sdílet prostřednictvím


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, Penguinnapříklad , , Whalea 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 structmá č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;

C++ class typedef in Class Designer

Příklad typedef struktury

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

C++ struct typedef in Class Designer

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 nastavena true (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 a char.

  • 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 usingznak , importsnebo #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, importsnebo #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.