Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
O Class Designer exibe uma superfície de design visual chamada diagrama de classes que fornece uma representação visual dos elementos de código em seu projeto. Você pode usar diagramas de classe para projetar e visualizar classes e outros tipos em um projeto.
O Class Designer suporta os seguintes elementos de código C++:
Classe (semelhante a uma forma de classe gerenciada, exceto que ela pode ter várias relações de herança)
Classe anónima (exibe o nome gerado pela Vista de Classes para o tipo anónimo)
Classe de modelo
Estrutura
Enum
Macro (exibe a vista pós-processada da macro)
Typedef
Observação
Isso não é o mesmo que o diagrama de classes UML, que você pode criar em um projeto de modelagem. Para obter mais informações, consulte Diagramas de classe UML: referência.
Classes de C++ no Class Designer
O Class Designer oferece suporte a classes C++ e visualiza classes C++ nativas da mesma maneira que formas de classe Visual Basic e C#, exceto que as classes C++ podem ter várias relações de herança. Você pode expandir o formato da classe para mostrar mais campos e métodos na classe ou recolhê-lo para poupar espaço.
Observação
O Class Designer não suporta uniões (um tipo especial de classe em que a memória alocada é apenas a quantidade necessária para o maior membro de dados da união).
Herança simples
Quando você arrasta mais de uma classe para um diagrama de classes e as classes têm uma relação de herança de classe, uma seta as conecta. A seta aponta na direção da classe base. Por exemplo, quando as seguintes classes são exibidas em um diagrama de classes, uma seta as conecta, apontando de B para A:
class A {};
class B : A {};
Também pode arrastar apenas a classe B para o diagrama de classes, clicar com o botão direito do rato na forma de classe para B e, em seguida, clicar em Mostrar Classes Base. Isso exibe sua classe base: A.
Herança múltipla
O Class Designer suporta a visualização de relações de herança de várias classes. A herança múltipla é usada quando uma classe derivada tem atributos de mais de uma classe base. Segue-se um exemplo de herança múltipla:
class Bird {};
class Swimmer {};
class Penguin : public Bird, public Swimmer {};
Quando você arrasta mais de uma classe para o diagrama de classes e as classes têm uma relação de herança de várias classes, uma seta as conecta. A seta aponta na direção das classes base.
Clicar com o botão direito do mouse em uma forma de classe e clicar em Mostrar Classes Base exibe as classes base para a classe selecionada.
Observação
O comando Show Derived Classes não é suportado para código C++. Você pode exibir classes derivadas indo para Modo de Exibição de Classe, expandindo o nó de tipo, expandindo a subpasta Tipos Derivados e arrastando esses tipos para o diagrama de classes.
Para obter mais informações sobre herança de várias classes, consulte Herança múltipla e várias classes base.
Classes abstratas
O Class Designer suporta classes abstratas (também chamadas de "classes base abstratas"). Estas são classes que você nunca instancia, mas das quais você pode derivar outras classes. Usando um exemplo de "Herança múltipla" anteriormente neste documento, você pode instanciar a Bird classe como objetos individuais da seguinte maneira:
int main()
{
Bird sparrow;
Bird crow;
Bird eagle;
}
No entanto, talvez você não pretenda instanciar a Swimmer classe como objetos individuais. Você pode pretender apenas derivar outros tipos de classes de animais a partir dele, por exemplo, Penguin, Whale, e Fish. Nesse caso, você declararia a Swimmer classe como uma classe base abstrata.
Para declarar uma classe como abstrata, você pode usar a palavra-chave abstract . Os membros marcados como abstratos, ou incluídos em uma classe abstrata, são virtuais e devem ser implementados por classes que derivam da classe abstrata.
class Swimmer abstract
{
virtual void swim();
void dive();
};
Você também pode declarar uma classe como abstrata incluindo pelo menos uma função virtual pura:
class Swimmer
{
virtual void swim() = 0;
void dive();
};
Quando você exibe essas declarações em um diagrama de classe, o nome Swimmer da classe e sua função swim virtual pura são exibidos em itálico em uma forma de classe abstrata, juntamente com a notação Classe abstrata. Observe que a forma de tipo de classe abstrata é a mesma de uma classe regular, exceto que sua borda é uma linha pontilhada.
Uma classe derivada de uma classe base abstrata deve substituir cada função virtual pura na classe base, ou a classe derivada não pode ser instanciada. Assim, por exemplo, se você derivar uma Fish classe da Swimmer classe, Fish deve substituir o swim método:
class Fish : public Swimmer
{
void swim(int speed);
};
int main()
{
Fish guppy;
}
Quando você exibe esse código em um diagrama de classe, o Class Designer desenha uma linha de herança de Fish para Swimmer.
Aulas anónimas
O Class Designer oferece suporte a classes anônimas. Tipos de classe anônimos são classes declaradas sem um identificador. Eles não podem ter um construtor ou destruidor, não podem ser passados como argumentos para funções e não podem ser retornados como valores de retorno de funções. Você pode usar uma classe anônima para substituir um nome de classe por um nome typedef, como no exemplo a seguir:
typedef struct
{
unsigned x;
unsigned y;
} POINT;
As estruturas também podem ser anónimas. O Class Designer exibe classes e estruturas anônimas da mesma forma que exibe o respetivo tipo. Embora tu possas declarar e exibir classes e estruturas anónimas, o Class Designer não usará o nome do marcador que especificares. Ele usará o nome que o Class View gera. A classe ou estrutura aparece em Class View e Class Designer como um elemento chamado __unnamed.
Para obter mais informações sobre classes anônimas, consulte Tipos de classe anônimos.
Classes de modelo
O Class Designer suporta a visualização de classes de modelo. Há suporte para declarações aninhadas. A tabela a seguir mostra algumas declarações típicas.
| Elemento de código | Vista do Designer de Classe |
|---|---|
template <class T>class A {}; |
A<T>Classe de modelo |
template <class T, class U>class A {}; |
A<T, U>Classe de modelo |
template <class T, int i>class A {}; |
A<T, i>Classe de modelo |
template <class T, template <class K> class U>class A {}; |
A<T, U>Classe de modelo |
A tabela a seguir mostra alguns exemplos de especialização parcial.
| Elemento de código | Vista do Designer de Classes |
|---|---|
template<class T, class U>class A {}; |
A<T, U>Classe de modelo |
template<class T>class A<T, T> {}; |
A<T, T>Classe de modelo |
template <class T>class A<T, int> {}; |
A<T, int>Classe de modelo |
template <class T1, class T2>class A<T1*, T2*> {}; |
A<T1*, T2*>Classe de modelo |
A tabela a seguir mostra alguns exemplos de herança em especialização parcial.
| Elemento de código | Modo de exibição Designer de Classe |
|---|---|
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>Classe de modelo BClass (pontos para a classe A) CClass (pontos para a classe A) |
A tabela a seguir mostra alguns exemplos de funções de modelo de especialização parcial.
| Elemento de código | Vista do Designer de Classe |
|---|---|
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 sobrecarga) |
template <class T1>class A {template <class T2>class B {};};template<> template<>class A<type>::B<type> {}; |
A<T1>Classe de modelo B<T2>Classe de modelo (B está contido na classe A sob Tipos Aninhados) |
template <class T>class C {};class A : C<int> {}; |
AClass -> C<int> C<T>Classe de modelo |
A tabela a seguir mostra alguns exemplos de herança de templates.
| Elemento de código | Visualizador de Classes |
|---|---|
template <class T>class C {};template<>class C<int> {class B {};}class A : C<int>::B {}; |
AClass ->B C<int>Class (B está contido na classe C dentro de Tipos aninhados) C<T>Classe de modelo |
A tabela a seguir mostra alguns exemplos de conexão de classe especializada canônica.
| Elemento de código | Vista do Designer de Classe |
|---|---|
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>Classe de modelo DClass ->C<float> |
class B {template <class T>T min (const T &a, const T &b);}; |
Bminutos <T> |
Enumerações C++ no Class Designer
Class Designer suporta C++ enum e tipos com enum class escopo. Segue-se um exemplo:
enum CardSuit {
Diamonds = 1,
Hearts = 2,
Clubs = 3,
Spades = 4
};
// or...
enum class CardSuit {
Diamonds = 1,
Hearts = 2,
Clubs = 3,
Spades = 4
};
Uma forma de enumeração C++ em um diagrama de classe parece e funciona como uma forma de estrutura, exceto que o rótulo lê Enum ou Enum classe, é rosa em vez de azul e tem uma borda colorida nas margens esquerda e superior. Tanto as formas de enumeração como as formas de estrutura têm cantos quadrados.
Para obter mais informações sobre como usar o enum tipo, consulte Enumerações.
Typedefs de C++ no Class Designer
As instruções Typedef criam uma ou mais camadas de indireção entre um nome e seu tipo subjacente.
O Class Designer suporta tipos typedef C++, que são declarados com a palavra-chave typedef, por exemplo:
typedef class coord
{
void P(x,y);
unsigned x;
unsigned y;
} COORD;
Em seguida, você pode usar esse tipo para declarar uma instância:
COORD OriginPoint;
Classes e formas de estrutura
No Class Designer, um typedef C++ tem a forma do tipo especificado no typedef. Se a fonte declarar typedef class, a forma tem cantos arredondados e o rótulo Classe. Para typedef struct, a forma tem cantos quadrados e o rótulo Struct.
Classes e estruturas podem ter typedefs aninhados declarados dentro delas. No Class Designer, as formas de classe e estrutura podem mostrar formas aninhadas de declarações typedef.
As formas Typedef suportam os comandos Mostrar como Associação e Mostrar como Associação de Coleção no menu do botão direito do mouse (menu de contexto).
Exemplo de classe typedef
class B {};
typedef B MyB;
Exemplo de Struct typedef
typedef struct mystructtag
{
int i;
double f;
} mystruct;
Typedefs sem nome
Embora você possa declarar um typedef sem um nome, o Class Designer não usa o nome da tag que você especificar. O Class Designer usa o nome que o Class View gera. Por exemplo, a declaração a seguir é válida, mas aparece no Modo de Exibição de Classe e no Designer de Classe como um objeto chamado __unnamed:
typedef class coord
{
void P(x,y);
unsigned x;
unsigned y;
};
Observação
O Class Designer não exibe typedefs cujo tipo de origem é um ponteiro de função.
Saiba mais sobre as limitações para elementos de código C++
Quando um projeto C++ é carregado, o Class Designer funciona de maneira somente leitura. Você pode alterar o diagrama de classes, mas não pode salvar as alterações do diagrama de classes de volta ao código-fonte.
O Class Designer suporta apenas semântica C++ nativa. Para projetos C++ que são compilados em código gerenciado, o Class Designer visualizará apenas elementos de código que são tipos nativos. Portanto, pode adicionar um diagrama de classe a um projeto, mas o Class Designer não permitirá que visualize elementos em que a propriedade
IsManagedestá definida paratrue, ou seja, tipos de valor e tipos de referência.Para projetos C++, o Class Designer lê apenas a definição do tipo. Por exemplo, suponha que você defina um tipo em um arquivo de cabeçalho (.h) e defina seus membros em um arquivo de implementação (.cpp). Se você invocar "View Class Diagram" no arquivo de implementação (.cpp, o Class Designer não exibirá nada. Como outro exemplo, se você invocar "View Class Diagram" em um arquivo de .cpp que usa uma
#includeinstrução para incluir outros arquivos, mas não contém nenhuma definição de classe real, o Class Designer novamente não exibirá nada.Os arquivos IDL (.idl), que definem interfaces COM e bibliotecas de tipos, não são exibidos em diagramas, a menos que sejam compilados para código C++ nativo.
O Class Designer não suporta funções e variáveis globais.
O Class Designer não suporta uniões. Este é um tipo especial de classe em que a memória alocada é apenas a quantidade necessária para o maior membro de dados do sindicato.
O Class Designer não exibe tipos de dados básicos, como
intechar.O Class Designer não exibe tipos definidos fora do projeto atual se o projeto não tiver referências corretas a esses tipos.
O Class Designer pode exibir tipos aninhados, mas não as relações entre um tipo aninhado e outros tipos.
O Class Designer não pode exibir tipos que são void ou que derivam de um tipo void.
Solucionar problemas de resolução de tipo e apresentação
Localização dos ficheiros de origem
O Class Designer não controla o local dos arquivos de origem. Portanto, se você modificar a estrutura do projeto ou mover arquivos de origem em seu projeto, o Class Designer poderá perder o controle do tipo (especialmente o tipo de origem de um typedef, classes base ou tipos de associação). Você pode receber um erro como Class Designer não consegue exibir esse tipo. Se o fizer, arraste o código-fonte modificado ou realocado para o diagrama de classes novamente para exibi-lo novamente.
Problemas de atualização e desempenho
Para projetos C++, pode levar de 30 a 60 segundos para que uma alteração no arquivo de origem apareça no diagrama de classes. Esse atraso também pode fazer com que o Class Designer lance o erro Nenhum tipo foi encontrado na seleção. Se você receber um erro como este, clique em Cancelar na mensagem de erro e aguarde até que o elemento de código apareça no Modo de Exibição de Classe. Depois de fazer isso, o Class Designer deve ser capaz de exibir o tipo.
Se um diagrama de classes não for atualizado com as alterações feitas no código, talvez seja necessário fechá-lo e abri-lo novamente.
Problemas de resolução de tipo
O Class Designer pode não conseguir resolver tipos pelos seguintes motivos:
O tipo está em um projeto ou assembly que não é referenciado a partir do projeto que contém o diagrama de classes. Para corrigir esse erro, adicione uma referência ao projeto ou assembly que contém o tipo. Para obter mais informações, consulte Gerenciando referências em um projeto.
O tipo não está no escopo correto, portanto, o Class Designer não pode localizá-lo. Certifique-se de que o código não está faltando uma
usinginstrução,importsou#include. Certifique-se também de que você não moveu o tipo (ou um tipo relacionado) para fora do namespace no qual ele foi originalmente localizado.O tipo não existe (ou foi descomentado). Para corrigir esse erro, certifique-se de que você não comentou ou excluiu o tipo.
O tipo está localizado numa biblioteca referenciada por uma diretiva #import. Uma possível solução é adicionar manualmente o código gerado (o arquivo .tlh) a uma diretiva #include no arquivo de cabeçalho.
Certifique-se de que o Class Designer suporta o tipo que você inseriu. Consulte Limitações para elementos de código C++.
O erro que você provavelmente verá para um problema de resolução de tipo é Código não pôde ser encontrado para uma ou mais formas no diagrama de classe '<elemento>'. Essa mensagem de erro não indica necessariamente que seu código está errado. Ele indica apenas que o designer de classe não pôde exibir seu código. Tente as seguintes medidas:
Certifique-se de que o tipo existe. Certifique-se de que não comentou ou eliminou involuntariamente o código-fonte.
Tente resolver o tipo. O tipo pode estar num projeto ou montagem que não está referenciado pelo projeto que contém o diagrama de classes. Para corrigir esse erro, adicione uma referência ao projeto ou assembly que contém o tipo. Para obter mais informações, consulte Gerenciando referências em um projeto.
Verifique se o tipo está no escopo correto para que o Class Designer possa localizá-lo. Certifique-se de que o código não está faltando uma
usinginstrução,imports, ou#include. Certifique-se também de que você não moveu o tipo (ou um tipo relacionado) para fora do namespace no qual ele foi originalmente localizado.
Sugestão
Para obter informações adicionais sobre solução de problemas, consulte Erros do Class Designer.