2
respostas

(C++) Duvida sobre declaração forward para class

Estou com duvidas sobre declaração forward de classses em c++. Eu tenho o arquivo cServer, cMain, cGlobal e cFileDB em .cpp e .h Todos os arquivos .h incluem cMain.h, em cMain.h eu fiz a declaração forward da classe cServer. Coloquei herança cServer nas classes cMain, cGlobal e cFileDB (os .cpp incluem cServer.h)

Porém retorna erro dizendo classe base indefinida.

Tentei colocar a definição forward antes da classe que fiz a herança, mas o mesmo problema persistiu.

Lembrando que as funções de cServer são static.

Como faço para usar a herança sem ter que incluir o include no .h de quem esta recebendo?

2 respostas

Olá, Eduardo

Parece que você está tendo um problema com a declaração forward e a herança em C++. Vamos tentar resolver isso juntos.

Primeiramente, é importante entender que a declaração forward é uma técnica usada para evitar dependências circulares entre arquivos de cabeçalho. No entanto, ela não é suficiente para habilitar a herança. Isso ocorre porque, para uma classe derivar de outra, o compilador precisa conhecer a definição completa da classe base, não apenas sua declaração.

No seu caso, você mencionou que está tentando herdar de cServer em cMain, cGlobal e cFileDB, mas está recebendo um erro de "classe base indefinida". Isso sugere que o compilador não tem a definição completa da classe cServer no momento em que está tentando compilar as classes derivadas.

A solução para o seu problema seria incluir o arquivo de cabeçalho cServer.h em cada um dos arquivos de cabeçalho das classes derivadas (cMain.h, cGlobal.h, cFileDB.h). Isso garantirá que o compilador tenha a definição completa da classe cServer quando estiver compilando as classes derivadas.

Aqui está um exemplo de como você pode fazer isso:

// cMain.h
#include "cServer.h"

class cMain : public cServer {
    // ...
};

// cGlobal.h
#include "cServer.h"

class cGlobal : public cServer {
    // ...
};

// cFileDB.h
#include "cServer.h"

class cFileDB : public cServer {
    // ...
};

Se você está preocupado em incluir o arquivo cServer.h em muitos lugares, uma prática comum é usar diretivas de pré-processador para garantir que o arquivo de cabeçalho seja incluído apenas uma vez.

// cServer.h
#ifndef CSERVER_H
#define CSERVER_H

class cServer {
    // ...
};

#endif

Espero que isso resolva o seu problema. Lembre-se, a declaração forward é uma ferramenta útil para evitar dependências circulares, mas não é suficiente para permitir a herança. Para a herança, o compilador precisa da definição completa da classe base.

Espero ter ajudado e bons estudos!

Obrigado pela resposta! Compreendi, eu realmente queria evitar a inclusão do .h nos .h para evitar dependência circular. No caso da herança de toda forma eu teria que incluir o cServer.h no .h, mas se não tiver herança o certo é incluir o cServer.h no .cpp de onde vai usar para evitar dependência circular? ou não importa?