Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

fred00

[Resolvido] Classes se incluindo - erro

Recommended Posts

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

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

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
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

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

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

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

 

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.