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

Localhost

Classes

Mensagens Recomendadas

Localhost

Tenho aqui duas dúvidas sobre classes:

1. Como é que eu tendo uma classe posso escrever a informação das variáveis em ficheiros?

2. Dentro de uma classe como é que eu posso declarar um array dessa mesma classe?

Obrigado desde já


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
TheDark

1. A ideia é exactamente a mesma que o que perguntaste aqui. A diferença é que deves querer utilizar o operador de inserção sobre a tua classe. Vê isto e isto. E possivelmente, em vez de quereres que o 1º parâmetro do operador seja ostream, deves querer que seja ofstream para restringir a ficheiros. Dentro do operador, terás que decidir se os dados são para ser legíveis por humanos, caso em que deves escrevê-los membro a membro, ou se será apenas para gravação de dados para carregamento futuro, caso em que será melhor escreveres um array de bytes com o método basic_ostream::write.

2. Com um membro apontador. E alocação dinâmica do array quando precisares dele, não esquecendo a libertação da memória no destrutor:

class MyClass {
    MyClass *innerMyClass;

    ~MyClass() {
        delete [] innerMyClass;
    }
public:
    public MyClass() { innerMyClass = NULL; }
    void AllocateInnerMyClass() {
        if (innerMyClass == NULL) {
            innerMyClass = new MyClass[100];
        }
    }
};


Desaparecido.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

1. Vou ver isso.

2. Eu não fiz isso tudo. Simplesmente declarei e pareceu resultar.

Eu tenho um ficheiro chamado classes.hpp e dentro desse ficheiro tenho todas as classes que quero para o meu jogo, só mesmo para aprender a trabalhar com classes. Tenho uma classe chamada Guns que contêm as armas que um certo jogador pode ter e tem umas quantas funções que não importam para o caso. O que eu queria era na classe Player declarar um array da classe Guns para que o tal Player tenha umas tais Guns. Ou seja, quero que um Player tenha as Guns. Como é que eu posso fazer isso? Eu declarei simplesmente uma array e resultou, tudo bem, mas depois eu quero que a informação sobre as Guns que o Player tem seja fixa mas que tenha lá a variável bool que eu pûs na classe Guns mude! Quero que mude apenas isso para se saber se o Player tem ou não tem a Gun de que nos estamos a referir.

Vou deixar aqui o ficheiro classes.hpp para uma melhor compreensão:

Classes.hpp:

using namespace std;

class Guns {
private:
	bool blHasGun;
	int iDefense;
	int iAttack;
	int iGeneral;
	int iCost;

public:
	int SeeGunStats() {
		return 0;
	}
};

class Player {
private:
	char SzName[1024];
	int iHealth;
	int iMoney;
	int iLevel;
	class Guns PlayerGuns[5];

public:
	int LoadInformation(const char *SzPlayerName, int iPlayerHealth, int iPlayerMoney, int iPlayerLevel/*, class Guns *LPlayerGuns*/) {
		strcpy(SzName,SzPlayerName);
		iHealth = iPlayerHealth;
		iMoney = iPlayerMoney;
		iLevel = iPlayerLevel;
		return 0;
	}

	int Fight() {
		return 0;
	}

	int BuyGun() {
		return 0;
	}

	int CheckStatus() {
		cout << "Name of your person: " << SzName << endl;
		cout << "Health of your person: " << iHealth << endl;
		cout << "Money of your person: " << iMoney << endl;
		cout << "Level of your person: " << iLevel << endl;
		return 0;
	}
};

class Monster {
private:
	char SzName[1024];
	int iPower;
	int iDefense;
	int iLevel;

public:
	int CheckStats() {
		return 0;
	}
};

Para pôr a informação fixa eu pensei em criar uma função dentro da classe Guns que fizesse o Load da tal informação com o nome das armas etc. e depois criar na classe Player uma função que mude o valor da variável bool no tal array. Mas não estou a ver como o posso fazer...

Como podes ver na função LoadInformation da classe Player eu tenho um parametro que é um ponteiro para o primeiro elemento do array de Guns. Só estou confuso em como hei-de trabalhar com isso.

Cumps  :)


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
TheDark

Mas o que tu fizeste não foi "Dentro de uma classe (...) declarar um array dessa mesma classe", tu declaraste um array de uma classe noutra classe. Sim, é tão simples como o que fizeste. Uma classe é, basicamente, exactamente a mesma coisa que uma struct em C, com muitas coisas extra, como alteração da visibilidade dos membros (public/protected/private) e a possibilidade de funções membro, ou métodos. Em C++, class e struct são praticamente o mesmo, sendo a única diferença a visibilidade por omissão dos membros,  que na struct são públicos, e na class privados.


Desaparecido.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
TheDark

Um aparte, não devias ter código no header. Se fores utilizar a classe noutro sítio qualquer vais ter problemas.

Não sei se percebi bem, mas como tens os campos todos privados, tens que criar métodos públicos para os manipulares. Do género:

class Guns {
        private:
                bool blHasGun;
                int iDefense;
                int iAttack;
                int iGeneral;
                int iCost;
       
        public:
                int SeeGunStats() {
                        return 0;
                }

                void setHasGun(bool hasGun) {
                        blHasGun = hasGun;
                }

                bool getHasGun() {
                        return blHasGun;
                }
};


Desaparecido.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Eu não queria manipular os campos dentro da classe.

Vou tentar explicar melhor. Eu quero que alguns campos sejam fixos, ou seja, que quando eu inicie o programa que aquilo vá tudo ao sitio e fique fixo (daí estar em private). No entanto quero manipular aquela variável do tipo bool mas quero manipulá-la na classe Player para que quando um Player tenha essa arma a variável bool fique com o valor true.

Quero que isto tudo aconteça, daí eu ter criado um array do tipo da class Guns para depois poder manipular aquela variável bool. Eu sei que quando é private não dá para manipular.

Entendes?

Iniciar Programa;
Inicializar nomes das armas etc.
Ir à classe Player e inicializar o jogador (nome, armas, etc.).
→ Aqui eu quero que ele inicialize a parte do array, dando true ou false à variável bool


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Ora bem, tentei resolver este problema.

O que eu fiz foi o seguinte:

→ Coloquei na classe Guns tudo a public.

→ Criei um método na classe Player que inicializa o nome, etc das armas.

Achas que isto é suficiente?

Tenho uma questão. Como é que agora eu vou saber se o Player tem a tal arma ou não? Eu recebo o array mas não sei se ele tem a arma. Será que é melhor inicializar isto tudo fora das classes, para ser mais fácil manipular os dados e trabalhar em conjunto com outras funções?

Edit: Fica aqui o código actualizado:

using namespace std;

class Guns {
public:
	char SzName[1024];
	int iDefense;
	int iAttack;
	int iGeneral;
	int iCost;
	bool blHasGun;
	int SeeGunStats() {
		return 0;
	}
};

class Player {
private:
	char SzName[1024];
	int iHealth;
	int iMoney;
	int iLevel;
	class Guns PlayerGuns[5];

public:
	int LoadInformation(const char *SzPlayerName, int iPlayerHealth, int iPlayerMoney, int iPlayerLevel, const class Guns *LPlayerGuns) {
		int iAux = 0;
		strcpy(SzName,SzPlayerName); 
		iHealth = iPlayerHealth;
		iMoney = iPlayerMoney;
		iLevel = iPlayerLevel;
		strcpy(LPlayerGuns[iAux].SzName,"Espada de fogo");
		LPlayerGuns[iAux].iDefense = 40;
		LPlayerGuns[iAux].iAttack = 10;
		LPlayerGuns[iAux].iGeneral = 25;
		LPlayerGuns[iAux].iCost = 100; 
		return 0;
	}

	int Fight() {
		return 0;
	}

	int BuyGun() {
		return 0;
	}

	int CheckStatus() {
		cout << "Name of your person: " << SzName << endl;
		cout << "Health of your person: " << iHealth << endl;
		cout << "Money of your person: " << iMoney << endl;
		cout << "Level of your person: " << iLevel << endl;
		return 0;
	}
};

class Monster {
private:
	char SzName[1024];
	int iPower;
	int iDefense;
	int iLevel;

public:
	int CheckStats() {
		return 0;
	}
};


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Sorry for the triple post, but:

Vi agora o que são construtores. Então acho que já tenho a solução para o meu problema! Crio um construtor de cada classe que inicializa todas as variáveis dessa classe.


here since 2009

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.