Solved Classe protected em biblioteca
-
Meu projeto é composto de subprojetos, vários desses são projetos de biblioteca estática, que são bibliotecas de classes. Porém, tenho uma classe nesse projeto que não pode ser exportada para fora da biblioteca, ou seja, essa classe deve ser acessível somente por outras classes dentro da biblioteca.
No Qt Creator quando adicionamos uma biblioteca a um projeto (Botão direito no projeto >>Add library) o projeto no qual a biblioteca foi adicionada passa a ter acesso a todas as classes da biblioteca. Tem como limitar isso, igual as classes protected no Java que só podem ser acessadas dentro do mesmo pacote? -
Pelo que sei de C++ (e não sou um expert), não existe o mesmo comportamento de Java ou C# em visibilidade da classes.
Voce pode tentar esconder a implementação, usando um design pattern chamado d-pointer (ou opaque pointer, ou ainda bridge pattern). O Qt usa este mecanismo para não expor a implementação para quem usa.
Este texto está em inglês, mas achei muito bom.
-
@TioRoy Interessante esse designer. Porém não era bem isso que eu tinha em mente. O que eu quero é fazer com que usuários da biblioteca sequer saibam da existência dessa classe, ou seja, não poderem dar include no .h, não sendo possível herdar ou tentar reimplementar.
Resumindo, para o usuário da biblioteca essa classe não existe, pois trata-se de uma classe abstrata que serve de base paras as outras classes da biblioteca, ela não faz sentido fora da biblioteca. Eu pensei em deixá-la toda em um .cpp para que não exista headers para dar include e nas classes dentro da biblioteca dar include no .cpp, mas segundo algumas pesquisas que fiz, encontrei muitos alertas e desaconselhamentos de usar include .cpp. -
O usuário só vai ter o header se você enviar pra ele. Além disso, as classes não são exportadas por padrão. Você precisa marcar as que serão com __declspec(dllexport), não?
-
@Leonardo Como falei essa biblioteca é um subprojeto de um projeto maior. No Qt Creator quando você importa (Add Library) uma biblioteca que está em outro projeto ela já dá acesso aos headers da biblioteca.
Meu ambiente é Ubuntu, GCC, Qt Creator, se não estou enganado __declspec não se aplica. -
Você pode compilar as bibliotecas estaticas em separado, e incluir no QtCreator apenas os includes que voce quer expor. Seria tipo um framework (com includes publicos e privados). Vai dar um pouco mais de trabalho, mas assim você esconde o que você quer.