fred00 0 Denunciar post Postado Abril 14, 2010 Olá galera! É o seguinte, estou num projeto que tem três classes: Predio, Casa, Rua, onde: - Predio tem um objeto Rua; - Casa tem um objeto Rua; - Rua tem objetos Predio e Rua. Quando compilo dá erro nas classes Predio e Casa: - expected `;' before '*' token - ISO C++ forbids declaration of `Rua' with no type Predio.h: #include "rua.h" class Predio { private: int numero; Rua *endereco; }; Casa.h: #include "rua.h" class Casa { private: int numero; Rua *endereco; }; Rua.h: #include "predio.h" #include "casa.h" class Rua { private: char nome; Casa *terreno; Predio *apartamento; }; Main (para teste): #include <iostream> #include "rua.h" using namespace std; int main() { return 0; } Alguém pode me dar uma luz? Valeu! Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Abril 14, 2010 Se você desenhar as classes, vai ver que não faz muito sentido o modo como o programa está sendo projetado. Os atributos da classe Rua deveria ser somente nome (talvez CEP também, mas não tenho certeza). O motivo p/ não fazer sentido essa inclusão de classes é que uma Casa fica numa Rua, mas ao incluir a classe Rua, você incluiria numa Casa todas as Casas e Predios da Rua. Além disso apartamento não é um Predio, ele pertence a um Predio, devendo ficar dentro da outra classe e ser do tipo inteiro ou string. E o terreno dificilmente é único p/ uma Rua: Casa e Predio tem seu próprio terreno (aí entram os detalhes como matrícula, quadra,etc). Compartilhar este post Link para o post Compartilhar em outros sites
fred00 0 Denunciar post Postado Abril 14, 2010 Se você desenhar as classes, vai ver que não faz muito sentido o modo como o programa está sendo projetado. Os atributos da classe Rua deveria ser somente nome (talvez CEP também, mas não tenho certeza). O motivo p/ não fazer sentido essa inclusão de classes é que uma Casa fica numa Rua, mas ao incluir a classe Rua, você incluiria numa Casa todas as Casas e Predios da Rua. Além disso apartamento não é um Predio, ele pertence a um Predio, devendo ficar dentro da outra classe e ser do tipo inteiro ou string. E o terreno dificilmente é único p/ uma Rua: Casa e Predio tem seu próprio terreno (aí entram os detalhes como matrícula, quadra,etc). Na verdade o que eu passei está simplificado, na Rua seriam listas de Casa e Predio. A Casa e o Predio devem saber em qual Rua estão, mas quando isso é feito dá erro de compilação; não é possível fazer isso? Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Abril 14, 2010 Na verdade o que eu passei está simplificado, na Rua seriam listas de Casa e Predio. Eu sei o que são ponteiros... Mas como eu falei: você vai incluir todas as Casas e Predios de uma rua dentro de uma única casa ou prédio, que não tem obrigação nenhuma de conhecer a rua inteira. Isso não faz o menor sentido. Levando p/ o lado de banco de dados, eu colocaria as listas de casas e prédios como atributos do relacionamento, e não de uma das entidades. Compartilhar este post Link para o post Compartilhar em outros sites
fred00 0 Denunciar post Postado Abril 14, 2010 Mas como eu falei: você vai incluir todas as Casas e Predios de uma rua dentro de uma única casa ou prédio, que não tem obrigação nenhuma de conhecer a rua inteira. Isso não faz o menor sentido. Entendi isso, realmente não faz sentido. Mas preciso que a Casa e Predio chamem métodos na classe Rua (rua que tem a Casa ou Predio), e Rua chame métodos na Casa e Predio; como posso fazer isso? Compartilhar este post Link para o post Compartilhar em outros sites
CaMiKaSe 0 Denunciar post Postado Abril 14, 2010 Mas como eu falei: você vai incluir todas as Casas e Predios de uma rua dentro de uma única casa ou prédio, que não tem obrigação nenhuma de conhecer a rua inteira. Isso não faz o menor sentido. Entendi isso, realmente não faz sentido. Mas preciso que a Casa e Predio chamem métodos na classe Rua (rua que tem a Casa ou Predio), e Rua chame métodos na Casa e Predio; como posso fazer isso? Poste todo o codigo, vai ficar bem mais facil de ajudar ! Tua classe Rua, nao tem metodo algum :s Se assim for, utilize somente estruturas e deu ! :) Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Abril 14, 2010 Tem um jeito sim: modelar direito ou usar guards p/ não ter inclusão recursiva e forward declaration. In file included from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from predio.h:1, from rua.h:1, from p3.cpp:2: rua.h:1:20: error: #include nested too deeply rua.h:2:18: error: #include nested too deeply http://en.wikipedia.org/wiki/Circular_dependency A melhor opção é refazer a modelagem. Compartilhar este post Link para o post Compartilhar em outros sites
fred00 0 Denunciar post Postado Abril 14, 2010 Mas como eu falei: você vai incluir todas as Casas e Predios de uma rua dentro de uma única casa ou prédio, que não tem obrigação nenhuma de conhecer a rua inteira. Isso não faz o menor sentido. Entendi isso, realmente não faz sentido. Mas preciso que a Casa e Predio chamem métodos na classe Rua (rua que tem a Casa ou Predio), e Rua chame métodos na Casa e Predio; como posso fazer isso? Poste todo o codigo, vai ficar bem mais facil de ajudar ! Tua classe Rua, nao tem metodo algum :s Se assim for, utilize somente estruturas e deu ! :) rua.h #include "predio.h" #include "casa.h" class Rua { private: char nome; Casa *terreno; Predio *apartamento; public: Rua(char); char getNome(); void inserirCasa(Casa*); void inserirPredio(Predio*); }; rua.cpp #include "rua.h" Rua::Rua(char _nome) { nome = _nome; } char Rua::getNome() { return nome; } void Rua::inserirCasa(Casa* _casa) { terreno = _casa; } void Rua::inserirPredio(Predio* _predio) { apartamento = _predio; } casa.h #include "rua.h" class Casa { private: int numero; Rua *endereco; public: Casa(int); void informarEndereco(Rua*); char solicitarEndereco(); }; casa.cpp #include "casa.h" Casa::Casa(int _numero) { numero = _numero; } void Casa::informarEndereco(Rua* _endereco) { endereco = _endereco; } char Casa::solicitarEndereco() { return endereco->getNome(); } predio.h #include "rua.h" class Predio { private: int numero,andar; Rua *endereco; public: Predio(int,int); void informarEndereco(Rua*); char solicitarEndereco(); }; predio.cpp #include "predio.h" Predio::Predio(int _numero, int _andar) { numero = _numero; andar = _andar; } void Predio::informarEndereco(Rua* _endereco) { endereco = _endereco; } char Predio::solicitarEndereco() { return endereco->getNome(); } Em casa.h e predio.h, onde tem Rua dá erro. Na declaração de Rua aparece: Multiple markers at this line - expected `;' before '*' token - ISO C++ forbids declaration of `Rua' with no type No método que tem Rua* como parametro: Multiple markers at this line - ISO C++ forbids declaration of `parameter' with no type - `Rua' has not been declared Quando eu tiro Rua da Casa e do Predio não tem erro. Compartilhar este post Link para o post Compartilhar em outros sites
fred00 0 Denunciar post Postado Abril 14, 2010 Tem um jeito sim: modelar direito ou usar guards p/ não ter inclusão recursiva e forward declaration. http://en.wikipedia.org/wiki/Circular_dependency A melhor opção é refazer a modelagem. Ok, mas não sei como fazer com que as classes Casa e Predio saibam em qual Rua estão sem ser desse jeito. Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Abril 14, 2010 Tem um jeito de uma classe acessar diretamente os atributos de outra: friend Mas da mesma forma você vai precisar mexer nas definições das classes. Compartilhar este post Link para o post Compartilhar em outros sites
fred00 0 Denunciar post Postado Abril 15, 2010 A solução foi colocar class Rua; Antes da definição da classe na casa.h e predio.h E incluir class Casa; class Predio; Antes da definição da classe em rua.h. Valeu a todos! Abraço! Compartilhar este post Link para o post Compartilhar em outros sites