Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

capzulu

problema com headers

Mensagens Recomendadas

capzulu

Boas pessoal,

Tenho o header Fabrica.h

#pragma once
#include <vector>
#include "Robot.h"

using namespace std;

class Fabrica
{
private:
vector<Robot *> robots;
public:
Fabrica(void);
~Fabrica(void);
};

E o header Robot.h

#pragma once

class Robot
{
private:
Fabrica *fabrica;
public:
void setFabrica(Fabrica &f){fabrica=f;}
Robot(void);
~Robot(void);
};

Queria que o robot conseguisse ir buscar valores à fabrica, mas não consigo compilar porque no Robot.h diz que Fabrica não está declarado, mas se meter #include "Fabrica.h" dá-me outros erros estranhos, que acho que deve ser de redefinições de headers.

Alguém me pode dar uma dica para conseguir compilar?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mogers

Usa [ code = cpp] (sem os espaços) para que o código fique com sintax highlighting para C++.

Não podes ter includes cruzados como esses. Uma solução é modificares o Robot.h deste modo:

#pragma once

class Fabrica;  // classe Fabrica existe e será definida noutro ficheiro

class Robot
{
private:
       Fabrica *fabrica;
public:
       void setFabrica(Fabrica * f){fabrica=f;}   // não podes usar referências para fábrica, tem de ser um apontador
       Robot(void);
       ~Robot(void);
};

Eu não sei os detalhes com pormenor, mas basicamente ali declaras que existe uma classe Fabrica definida "algures". Assim, como a classe Fabrica não está definida aqui, apenas podes usar apontadores porque ao processar este ficheiro, o compilador não sabe o que são objectos "Fabrica".

Durante a compilação, o compilador vai buscar a classe Fabrica e usá-la devidamente aqui.


"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
capzulu

Ok, obrigado pela resposta.

Isso resolveu-me parcialmente o problema.

Eu depois tenho então esta função para enviar a Fabrica para os Robots

void Fabrica::next(){
for(unsigned int i=0;i<robots.size();i++){
	robots[i]->setFabrica(this);
	robots[i]->accao();
}
}

Mas depois, na classe Robot, quando tento fazer um get de um atributo da classe Fabrica, por exemplo:

int i=fabrica->getNum_pisos();

da-me:

                error C2027: use of undefined type 'Fabrica'

                error C2227: left of '-> getNum_pisos' must point to class/struct/union/generic type

A classe Fabrica já não está definida?

Eu não sei se esta é a melhor maneira de se fazer isto, eu queria que o Robot recebesse uma referência da fábrica sempre que dela precisar? Há alguma maneira mais simples que esta?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
TheDark

Supondo que tens a definição das classes separada da implementação, tens que incluir o Fabrica.h no Robot.cpp.


Desaparecido.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mogers

o tópico tem quase 3 anos..........


"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.