Dependência circular [RESOLVIDO]

1. Dependência circular [RESOLVIDO]

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 13/08/2014 - 20:59h

Eu tenho duas classes que dependem uma da outra, só que já tentei usar forward declaration e nada de funcionar. Os headers estão mais ou menos assim:

// fighter.hpp
#include "stage.hpp"
class CStage; // forward declaration de CStage

class CFighter
{
public:
CStage * stage;

void set_stage ( CStage * s )
{
stage = s;
}
};

// stage.hpp
#include "fighter.hpp"
class CFighter; // forward declaration de CFighter

class CStage
{
CFighter * first;
CFighter * second;
};


Acontece que no método set_stage de CFighter dá erro na compilação, diz que o membro 'stage' não foi declarado, mas tenho certeza que está declarado. Acho que o problema é essa "dependência cruzada" de classes.

Alguém tem ideia de como resolvo isso?



  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 14/08/2014 - 13:46h

Sam L. escreveu:

Eu resolvi retirar o método set_stage e tornei o membro stage público. Parece que esse g++ é "feito nas coxas" e não aceitava o que tava fazendo.


Hehehe... Certamente a culpa do seu programa simplíssimo e curto não ter compilado é do compilador mais usado no mundo.

Eu gostaria de lhe dar alguma dicas:

1) Quando você vier aqui e disser que uma função-membro provoca uma falha ao tentar acesso a um outro membro de uma classe, não omita nem a declaração nem a definição dessa função nem dos membros a que ela faz acesso. Não somos videntes nem adivinhos.

2) Pelo mesmo motivo, apresente as mensagens de erro mostradas a você pelo compilador.

3) Quando você tiver arquivos de cabeçalhos, proteja-os contra inclusão recursiva usando a construção clássica mostrada abaixo.

/* Arquivo a.h */

#ifndef __A_H__
#define __A_H__

class A {
/* ... */
};

#endif


Eu criei duas classes com membros, em cada uma, que são ponteiros para a outra, de um modo idêntico ao que você mostrou, e criei funções-membros que faziam acesso aos ponteiros. Não tive qualquer problema nem de compilação nem de execução.

Assim sendo, eu GARANTO que você estava fazendo alguma coisa equivocada. Mas, como eu disse acima, só poderemos apontar exatamente o quê e onde se você mostrar mais do seu programa do que mostrou aqui.





Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts