Pergunta

Eu tenho várias classes que derivam de uma classe base, agora algumas das classes derivadas não serão compiladas dependendo da plataforma.Eu tenho uma classe que me permite retornar um objeto da classe base, porém agora todos os nomes das classes derivadas foram codificados.

Existe uma maneira de determinar quais classes foram compiladas, de preferência em tempo de execução, para que eu possa remover a vinculação e, em vez disso, fornecer bibliotecas carregáveis ​​dinamicamente.

Foi útil?

Solução

Você está procurando registro de classe de tempo de execução C++?Eu achei isto link (cópia de segurança).

Isso provavelmente conseguiria o que você deseja. Não tenho certeza sobre os módulos carregados dinamicamente e se você pode ou não registrá-los usando o mesmo método.

Outras dicas

Não sei o que você realmente está tentando realizar, mas você poderia colocar um construtor singleton no arquivo de implementação de cada classe derivada que adiciona o nome a uma lista, junto com um ponteiro para uma fábrica.Assim a lista fica sempre atualizada podendo criar todos os compilados nas aulas.

Geralmente, confiar nas informações do tipo de tempo de execução é uma má ideia em C++.O que você descreveu parece ser o padrão de fábrica.Você pode considerar a criação de uma subclasse de fábrica especial para cada plataforma, que conheceria apenas as classes existentes nessa plataforma.

Parece um lugar para usar "polimorfismo em tempo de compilação" ou parâmetros de política de modelo.

Veja Modern C++ Design de Andrei Alexandrescu e seu Loki implementação baseada no livro.Veja também o Loki página na Wikipédia.

Existem truques desagradáveis ​​específicos do compilador para obter informações de classe em tempo de execução.Acredite em mim, você não quer abrir aquela lata de minhocas.

Parece-me que a única maneira séria de fazer isso seria usar a compilação condicional em cada uma das classes derivadas.Dentro do bloco #ifdef, defina um novo constante que contém o nome da classe que está sendo compilada.Então, os nomes ainda estão codificados, mas todos em um local central.

Os nomes das classes derivadas devem ser codificados em C++.Não há outra maneira de usá-los.Portanto, não só não há como detectar automaticamente quais classes foram compiladas, como também não haveria como usar essas informações se elas existissem.

Se você pudesse especificar classes em tempo de execução com base em seus nomes, algo como:

std::string foo = "Derivado1";Base * objeto = novo "foo";// ou qualquer notação que você quiser - não funciona em C++

então a capacidade de saber se "Derived1" foi compilado ou não seria útil.Já que você precisa especificar a classe diretamente, como:

Base * objeto = novo Derivado1;//funciona em C++

toda a verificação é feita em tempo de compilação.

Se cada classe tiver sua própria biblioteca dinâmica, basta verificar se a biblioteca existe.

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