Pergunta

qual é a melhor maneira de colocar uma classe de contêiner ou alguma outra classe dentro de uma classe como privada ou um membro do público?

Requisitos:

1.Vector dentro da minha classe

Interface

2.Adicione e contar de vector é necessário

Foi útil?

Solução

Se o estado do recipiente é parte de invariante da classe, então ele deve, se possível, ser privado.

Por exemplo, se o recipiente representa um vector tridimensional, em seguida, parte da invariante pode ser que ele sempre contém exatamente 3 números. Expondo-o como um membro do público iria permitir que o código externo à classe para alterar o tamanho contentores, que por sua vez poderia causar problemas para qualquer rotina que exige o tamanho do recipiente para ser constante. Manter os limites privadas recipiente os lugares em seu software onde o tamanho do recipiente podem ser modificados para funções membro da classe.

Outras dicas

Se um membro é declarado privado ou depende Pública inteiramente da sua aplicação. você poderia dar mais algum detalhe?

Um ponto importante a lembrar quando declarar seu membro é que se você fornecer um "getter" para recuperá-lo, então você não está mais encapsular esse objeto. Em vez disso, ele pode ser bom para os métodos de mensagens publicitárias gravação expondo apenas a funcionalidade que você deseja expor.

Por exemplo, com um membro do Vector, você pode escrever um método AddItem e claro, se é toda a funcionalidade que você deseja expor.

Uma vez que você está falando de uma classe, eu acho que deveria ser privado. Se você quer que ele seja público, em vez criar um struct -. Para torná-lo óbvio que você deseja que o membros variáveis ??a serem utilizadas

Uma alternativa viável para expor o elemento de vector é a criação de uma função de visitante (ou uma iteração interna). Desta forma, você obedecer à lei de Demeter melhor:

class ContWrapper {
    std::vector<int> _ints;
public:
    class Action {
    public: 
        virtual void accept( int i ) = 0;
    };
    void each_int( Action& a );
};

Também tenha muito cuidado ao exportar por exemplo um std::vector<T> de uma biblioteca, também: o código do cliente não pode usar a mesma implementação STL como você fez, então o layout dessas variáveis ??membro pode diferir

Faça todos os membros privado e uso métodos de acesso, o que lhe permite alterar a implementação mais tarde. Só em circunstâncias muito incomuns que eu iria fazer qualquer público membro de dados.

Lembre-se que chaning a implementação acontece com mais freqüência do que você pode imaginar, não é apenas um caso de mudar o tipo de recipiente, mas talvez você queira alterar o mecanismo. Digamos que você estava armazenando nomes em uma lista, depois de um tempo você pode optar por índice esta lista com um hash e gostaria de ter o hash atualizado a cada vez que você adicionar um novo nome. Se sua implementação é adequadamente encapsulado fazendo isso é fácil, se você acabou de expor o vetor você precisa fazer alterações que irá ajustar a interface (e assim a mudança vai se propagam para fora).

Se isto é novo para o novo você tem uma leitura de: http: // en.wikipedia.org/wiki/Encapsulation_(classes_-_computers)

Há uma terceira via - às vezes é melhor para herdar a partir do recipiente e substituir seus métodos para atingir seu objetivo (por exemplo, a segurança do thread). De qualquer forma, torná-la pública quase sempre não é uma boa idéia.

Considerando que você deseja encapsular o recipiente dentro de outro classe implica que não podem ser públicas, e também os métodos públicos de sua classe não deve expor aplicação específica nada sobre o recipiente. Dessa forma, a implementação de sua classe (ou seja, o container) pode ser alterado sem alterar a sua interface.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top