Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

capzulu

problema com headers

Recommended Posts

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?

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other sites
TheDark

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


Desaparecido.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.