Impedir a criação de classe cujas funções membro são todos estática

votos
9

Todas as variáveis ​​de membro e funções membro da minha ClassA classe são estáticos.

Se um usuário está tentando (por engano) para criar um objeto dessa classe, ele recebe um aviso: ClassA, variável local não referenciado, porque todas as funções são estáticos, então este objeto nunca é referenciado. Então, eu quero impedir que o usuário tentar criar um objeto dessa classe.

Seria o suficiente para criar um padrão particular (sem variáveis) construtor? Ou eu tenho também criar construtor de cópia privada e operador de atribuição privada (para evitar usando os construtores padrão)? E se eu tenho que criá-los também, talvez seria melhor apenas para criar alguma função virtual pura manequim em vez disso, e isso vai impedir que o usuário criar um objeto?

Obrigado

Publicado 09/12/2008 em 18:17
fonte usuário
Em outras línguas...                            


5 respostas

votos
20

Em vez de usar uma classe com todos os métodos estáticos, você pode ser melhor fora de fazer os métodos de free-standing funções em um espaço separado. A sintaxe de chamada seria o mesmo:

namespace::function() ao invés de classname::function()

e você não precisa lidar com alguém que tenta instanciar sua classe.

Respondeu 09/12/2008 em 18:28
fonte usuário

votos
11

Criando um construtor padrão privado deve ser suficiente. Ambas as outras construções padrão (construtor de cópia e atribuição) confiar em ter uma instância para funcionar corretamente. Se não houver um construtor padrão, então não há nenhuma maneira de criar uma instância, portanto, nenhuma maneira de chegar realmente à parte de construção cópia.

Ele provavelmente iria poupar algumas dores de cabeça embora para definir todos os 3 como privado e não implementado.

Respondeu 09/12/2008 em 18:19
fonte usuário

votos
10

Como outros disse, um namespace é o que você deve usar. Se você quiser ficar com a sua classe, crie uma classe que tem um construtor privado, e dela derivam, para tornar a sua intenção óbvia:

class NonConstructible { 
    NonConstructible();
};

class SuperUtils: NonConstructible {
    static void foo();
    // ...
    static std::vector<int> globalIDs;
    // ...
};

Ok, agora vamos olhar para o espaço de nomes que são a única maneira de fazer isso:

namespace SuperUtils {
    void foo() {
        // ....
    }

    std::vector<int> globalIDs;
};

Você pode chamar isso usando SuperUtils::foo();em ambos os casos, mas o namespace tem a vantagem de que em um escopo, você pode usar a declaração de namespace e directiva para trazer certos ou todos os membros dentro do escopo atual, de modo que você pode referenciá-los sem o uso de SuperUtils:::

void superFunction() {
    using namespace SuperUtils;
    foo();
}

Embora geralmente que deve ser evitado, ele pode ser útil quando o método está usando exclusivamente muita coisa a partir SuperUtils, que então podem melhorar a legibilidade do código.

Respondeu 09/12/2008 em 18:54
fonte usuário

votos
3

Para utilizar um construtor de cópia você tem que ter um objeto para copiar, por isso, se você tiver bloqueado o construtor padrão você deve ser seguro.

Respondeu 09/12/2008 em 18:20
fonte usuário

votos
0

A melhor maneira de evitar a criação de objetos não-heap é fazer destructor privado. Então não há nenhuma maneira compilador pode destruir o objeto quando ele sai do escopo e vai reclamar. Isso não vai impedir ninguém de fazer nova no entanto.

Respondeu 10/12/2008 em 09:35
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more