Jump to content
Psycop

[Resolvido] Dúvida com Vectores de Objectos e a Sua Gravação em ficheiro

Recommended Posts

Psycop

Estou a desenvolver um pequeno jogo ao estilo FM em C++ para a faculdade, mas tenho me deparado com alguns problemas nomeadamente entre Classes, a criação de vectores de Objectos e a gravação desses vectores de objectos em ficheiros.

O código que tenho desenvolvido até agora é o seguinte:

A minha actual dúvida está no método save_equipa e como colocar lá dentro os jogadores recolhidos de forma formatada para que posteriormente possam ser lidos pela aplicação directamente.

Equipa.h

#pragma once
#include<iostream>
#include<string>
#include<fstream>
#include"Jogador.h"
using namespace std;
class Equipa
{
private:
string nome_equipa;
string nome_ficheiro;
public:
//Construtor da Classe Equipa
Equipa(void);
//Métodos de Acesso
//Métodos de Acesso de Leitura
string getNome_Equipa() const {return nome_equipa;}
//Métodos de Acesso de Escrita
bool setNome_Equipa(const string nome_equipa);
//Método para Recolher o Nome da Equipa
void criar_equipa(void);
//Método para Apresentar a Equipa no Ecra
void show_equipa(void);
//Método para Gravar a Equipa Num Ficheiro
void save_equipa(ofstream &ficheiro_saida) const;
//Destrutor da Classe Equipa
virtual ~Equipa(void);
};

Equipa.cpp

#include "Equipa.h"
#include "Jogador.h"

Equipa::Equipa(void)
{
this -> nome_equipa = " ";
}

Equipa::~Equipa(void)
{
}
bool Equipa::setNome_Equipa(const string nome_equipa)
{
this -> nome_equipa = nome_equipa;
return true;
}
//Implementação do Método Criar Equipa
void Equipa::criar_equipa(void)
{
cout << "Insira o Nome da Equipa: ";
cin >> nome_equipa;

Jogador J[11];
//Equipa Composta por 11 Jogadores
for(int i = 0; i < 2; i++)
{
J[i].criar_jogador();
}
}
//Implementação do Método Mostrar Equipa
void Equipa::show_equipa(void)
{
cout << endl << "O Nome da Equipa e: " << nome_equipa << endl << endl;
}
//Implementação do Método de Gravação da Equipa Num Ficheiro
void Equipa::save_equipa(ofstream &ficheiro_saida) const
{
string nome_ficheiro;
nome_ficheiro = getNome_Equipa() + ".txt";
//Abertura do Ficheiro de Saida
ficheiro_saida.open(nome_ficheiro);
//Verificar a Abertura do Ficheiro
if(!ficheiro_saida)
{
cout << "ERRO!!" << endl;
system("PAUSE");
exit(1);
}
//Escrever no Ficheiro
ficheiro_saida << "Nome da Equipa: " << getNome_Equipa() << endl;

//Fechar o Ficheiro de Saida da Equipa
ficheiro_saida.close();
}

Jogador.h

#pragma once
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
class Jogador
{
private:
//Definição das Caractereisticas do Jogador
string nome_jogador;
int idade_jogador;
float ataque, defesa, forca, tecnica, resistencia, velocidade;
public:
//Construtor da Classe
Jogador(void);
//Métodos de Acesso
//Metodos Acesso de Leitura
string getNome_Jogador() const {return nome_jogador;}
int getIdade_Jogador() const { return idade_jogador;}
float getAtaque() const { return ataque;}
float getDefesa() const { return defesa;}
float getForca() const { return forca;}
float getTecnica() const { return tecnica;}
float getResistencia() const { return resistencia;}
float getVelocidade() const {return velocidade;}
//Métodos de Acesso de Escrita
bool setNome_Jogador(const string nome_jogador);
bool setIdade_Jogador(const int idade_jogador);
bool setAtaque(const float ataque);
bool setDefesa(const float defesa);
bool setForca(const float forca);
bool setTecnica(const float tecnica);
bool setResistencia(const float resistencia);
bool setVelocidade(const float Velocidade);
//Método para Criar o Jogador
void criar_jogador(void);
//Método para Mostrar o Jogador
void show_jogador(void);
//Destrutor da Classe
virtual ~Jogador(void);
};

Jogador.cpp

#include "Jogador.h"
//Implementação do construtor da Classe Jogador
Jogador::Jogador(void)
{
this -> nome_jogador = " ";
this -> idade_jogador = 0;
this -> ataque = 0.0;
this -> defesa = 0.0;
this -> forca = 0.0;
this -> tecnica = 0.0;
this -> resistencia = 0.0;
this -> velocidade = 0.0;
}
//Implementação do destrutor da Classe Jogador
Jogador::~Jogador(void)
{
}
//Implementação dos métodos de Acesso
bool Jogador::setNome_Jogador(const string nome_jogador)
{
this -> nome_jogador = nome_jogador;
return true;
}
bool Jogador::setIdade_Jogador(const int idade_jogador)
{
this -> idade_jogador = idade_jogador;
return true;
}
bool Jogador::setAtaque(const float ataque)
{
this -> ataque = ataque;
return true;
}
bool Jogador::setDefesa(const float defesa)
{
this -> defesa = defesa;
return true;
}
bool Jogador::setForca(const float forca)
{
this -> forca = forca;
return true;
}
bool Jogador::setResistencia(const float resistencia)
{
this -> resistencia = resistencia;
return true;
}
bool Jogador::setTecnica(const float tecnica)
{
this -> tecnica = tecnica;
return true;
}
bool Jogador::setVelocidade(const float velocidade)
{
this -> velocidade = velocidade;
return true;
}

//Implementação do Método Criar Jogador
void Jogador::criar_jogador(void)
{
cout << "Insira o Nome do Jogador: ";
cin >> nome_jogador;
cout << "Insira a Idade do Jogador: ";
cin >> idade_jogador;
cout << endl << "Insira as Caracteristicas do Jogador: " << endl;
cout << "\t Insira o Valor do Ataque (0 a 1): ";
cin >> ataque;
cout << "\t Insira o Valor de Defesa (0 a 1): ";
cin >> defesa;
cout << "\t Insira o Valor de Forca (0 a 1): ";
cin >> forca;
cout << "\t Insira o Valor da Resistencia (0 a 1): ";
cin >> resistencia;
cout << "\t Insira o valor da Tecnica (0 a 1): ";
cin >> tecnica;
cout << "\t Insira o Valor da Velocidade (0 a 1): ";
cin >> velocidade;
}
//Implementação do Método Show_Jogador
void Jogador::show_jogador(void)
{
cout << endl << "Nome do Jogador: " << nome_jogador << endl;
cout << "Idade do Jogador: " << idade_jogador << endl;
cout << "Ataque: " << ataque << endl;
cout << "Defesa: " << defesa << endl;
cout << "Forca: " << forca << endl;
cout << "Resistencia: " << resistencia << endl;
cout << "Tecnica: " << tecnica << endl;
cout << "Velocidade: " << velocidade << endl;
}

main.cpp

#include<iostream>
#include<string>
#include"Equipa.h"
#include"Jogador.h"
#include"Treinador.h"
using namespace std;
int main()
{
//Definição da variavel de escolha para a Opção do Menu
int escolha = 1;
//MENU
cout << "Menu: " << endl << endl;
cout << "Configuracao do Jogo:" << endl << endl;
cout << "\t 1 - Criar um Novo Jogo" << endl;
cout << "\t 2 - Carregar Jogo Existente" << endl;
cout << "\t 3 - Salvar Jogo" << endl;
cout << "\t 4 - ... outra opcao ..." << endl;
cout << "\t 5 - SAIR" << endl << endl;
cout << "Opcao: ";
cin >> escolha;
//Estrutura de escolha do MENU Principal
switch(escolha)
{
case 1:
{
cout << "1 - Criar um Novo Jogo" << endl;

//Defeinição da variavel de escolha para o MENU criar Jogo
int escolha_novo_jogo = 1;
//MENU Novo Jogo
cout << endl << endl << "Menu: " << endl << endl;
cout << endl << "Configuração do Jogo:" << endl << endl;
cout << "\t 1 - Inserir Equipa" << endl;
cout << "\t 2 - Editar Equipa" << endl;
cout << "\t 3 - Consultar Equipa" << endl;
cout << "\t 4 - Apagar Equipa" << endl;
cout << "\t 5 - SAIR" << endl << endl;
cout << "Opcao: ";
cin >> escolha_novo_jogo;
//Estrutura de escolha do MENU criar Jogo
switch(escolha_novo_jogo)
{
case 1:
{
 //Definição da variavel para o Numero de Equipas
 int n_equipas = 0;
 cout << endl << "1 - Inserir Equipa" << endl;
 cout << endl << "Insira o Numero de Equipas Que Pretende Inserir: ";
 cin >> n_equipas;
 Equipa E[2];
 //Abertura do Ficheiro de Saida
 ofstream ficheiro_saida;
 for(int i = 0; i < n_equipas; i++)
 {
 E[i].criar_equipa();
 E[i].save_equipa(ficheiro_saida);
 }
 break;
}
case 2:
{
 cout << "2 - Editar Equipa" << endl;
 break;
}
case 3:
{
 cout << "3 - Consultar Equipa" << endl;
 break;
}
case 4:
{
 cout << "4 - Apagar Equipa" << endl;
 break;
}
case 5:
{
 cout << "5 - SAIR" << endl;
 exit(0);
}
default:
{
 cout << "Opcao Invalida!!!" << endl;
 break;
}
}
break;
}
case 2:
{
cout << "2 - Carregar Jogo Existente" << endl;
break;
}
case 3:
{
cout << "3 - Salvar Jogo" << endl;
break;
}
case 4:
{
cout << "... Outra Opcao ..." << endl;
break;
}
case 5:
{
cout << "5 -SAIR" << endl;
exit(0);
}
default:
{
cout << "Opcao Invalida!!!" << endl;
break;
}

//Teste de Opção Escolhida Inválida
if(escolha < 1 || escolha > 5)
{
cout << "Opcao Inválida!!!" << endl;
}
}

system("PAUSE");
return 0;
}

Alguém me pode dar umas dicas e elucidar de como devo abordar estas situações?

Cumps

Edited by Psycop

Share this post


Link to post
Share on other sites
HappyHippyHippo

antes de pensar em gravar os dados em ficheiros, podes responder a esta questão :

- onde estão guardados os dados dos jogadores da equipa ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Psycop

Pois, essa é uma das minhas dúvidas também! Em teoria estariam a ser recolhidos pelas variáveis implementadas na classe jogador.cpp...

Mas quando faço:

Jogador J[11];
//Equipa Composta por 11 Jogadores
for(int i = 0; i < 2; i++)
{
J[i].criar_jogador();
}
}

Não estou a criar um objecto para cada jogador que fica afecto a classe equipa?

Share this post


Link to post
Share on other sites
HappyHippyHippo

um objecto é como uma variável:

int main() {
 for (int i = 0; i < 10; i++) {
   int j = i + 1;

   cout << "i : " << i;
   cout << " | j : " << j << endl;
 }

 cout << "i : " << i;             // a variável i está "morta"
 cout << " | j : " << j << endl;  // a variável j está "morta"

 return 0;
}

pensa bem no código que tens


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
HappyHippyHippo
void Equipa::criar_equipa(void)
{
 cout << "Insira o Nome da Equipa: ";
 cin >> nome_equipa;

 Jogador J[11]; // <------------- crias um array de objectos "jogador"

 for(int i = 0; i < 2; i++)
 {
   J[i].criar_jogador();
 }
 // <--------------------------- a função termmina, puf ... o array desaparece
}


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
HappyHippyHippo

uma classe é praticamente uma estrutura com algumas nuances

por outras palavras, um objecto/classe é um conjunto de dados aos quais existe um conjunto de métodos associados

qual a informação que define uma equipa ?

- nome da equipa

- conjunto de jogadores

- ... etc ...

imagina que estarias a programar em C:

struct Jogador {
 char nome[64];
 // ... por ai adiante ...
};

struct Equipa {
 char nome[64];
 Jogador jogadores[11];
 // ... por ai a diante ...
};

o mesmo é necessário fazer com uma classe:

class Jogador {
 std::string nome;
 // ... por ai a diante ...
};

class Equipa {
 std:string nome;
 std::vector<Jogador> jogadores;
 // ... por ai a diante ...
};

deste modo, a informação da equipa persiste enquanto a classe "existe"


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Psycop

Mas agora fico com problemas no:

//Implementação do Método Criar Equipa
void Equipa::criar_equipa(void)
{
cout << "Insira o Nome da Equipa: ";
cin >> nome_equipa;

vector<Jogador> J[11];
//Equipa Composta por 11 Jogadores
for(int i = 0; i < 2; i++)
{
 J[i].criar_jogador();
}
}

Não deveria ser igual ao que tinha anterior? Porquê agora o erro no método criar_jogador();

Cumps

Share this post


Link to post
Share on other sites
HappyHippyHippo

o que tens está mal a tantos níveis que não sei por onde começar.

gostava que daqui a uns meses viesses ver este post para veres o que estás a escrever ...

o problema demonstra uma falta clara de conhecimento de conceitos básicos de programação como o scope e local variables e variable lifetime, coisas que deveriam ser ensinadas na primeira meia dúzia de aulas de programação.

para não falar de que tens um array de vectores de jogadores, código que apresentas com total falta de conhecimento do que escreveste.

por isso mesmo, ao não saber se o problema é tu não estudares ou o teu professor ser um incompetente, será impossível determinar qual a acção a tomar que não seja : vai ler sobre os assuntos descritos no parágrafo anterior


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Rui Carlos

Mas agora fico com problemas no:

//Implementação do Método Criar Equipa
void Equipa::criar_equipa(void)
{
cout << "Insira o Nome da Equipa: ";
cin >> nome_equipa;

vector<Jogador> J[11];
//Equipa Composta por 11 Jogadores
for(int i = 0; i < 2; i++)
{
 J[i].criar_jogador();
}
}

Não deveria ser igual ao que tinha anterior? Porquê agora o erro no método criar_jogador();

Cumps

Nesse caso, o teu problema está na inicialização do vector, que devia ser vector<Jogador> J(11); (por exemplo). De todo o modo, continuas com uma série de problemas no teu código, já mencionados pelo HappyHippyHippo.

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

×
×
  • Create New...

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.