Jump to content

Recommended Posts

Posted

Boas é o seguinte tenho que fazer um jogo de blackjack usando classes mas ja estou a ter um problema: queria saber como posso fazer push_back para um vector de classes, estou a dividir o meu codigo em .h e .cpp, esta-me aqui a dar um erro que nao faço ideia o que seja, junto posto o meu codigo

//Card.h
#ifndef CARTA_H
#define CARTA_H

class Carta
{
public:
int naipe;
int tipo;
//void SetNaipe();
};

#endif

//Jogo.h
#ifndef JOGO_H
#define JOGO_H
#include "Carta.h"
#include <vector>
using namespace std;

class Jogo
{
private:
vector <Carta> Baralho;
public:
Jogo();
void BaralhaCartas();
};

#endif

//Jogo.cpp

#include "Jogo.h"
#include "Card.h"
#include <iostream>
using namespace std;

char naipe [4] = { 'C', 'E', 'O', 'P' };
char tipo [13] = { '2', '3', '4', '5', '6', '7', '8', '9', '10', 'Q', 'J', 'K', 'A'};
vector <Carta> Baralho


void Jogo::BaralhaCartas()
{
for (int i=0; i<4; i++)
{
		naipe [i];
		for (int n=0; n<13; n++)
	Baralho.push_back(Carta(naipe[i], tipo[n]));
}
}

//main.cpp

#include <iostream>
using namespace std;
#include "Jogo.h"


int main()
{
Jogo Game;

Game.BaralhaCartas();

return 0;
}

O meu problema surge no Jogo.cpp aqui "Baralho.push_back(Carta(naipe, tipo[n]));" dá-me erro no naipe "no suitable constructor exists to convert from "char" to "Carta", por favor se souberem o que tenho que fazer para corrigir este erro digam-me.. Obrigado desde ja pela atenção

Posted

Você precisa adicionar um construtor na classe Carta, que aceite um char (naipe) e um int (tipo) para poder chamar o construtor do jeito que você está fazendo. Fica algo assim (não testei):

class Carta
{
public:
        Carta(char n, int t)
       {
             naipe=n;
             tipo=t;
       }
        char naipe;
        int tipo;
        //void SetNaipe();
};

outra coisa que mudei foi que no original o naipe estava como int e você estava incializando como char. Então mudei para char.

Fernando Lage Bastos - MCP/MCTS/MCPD

Posted

Obrigado ja foi uma grande ajuda, mas o compilador ainda me esta a dar 3 erros:

c:\users\ricardo\documents\visual studio 2010\projects\esperiments(class)\esperiments(class)\jogo.cpp(7): warning C4305: 'initializing' : truncation from 'int' to 'char'

c:\users\ricardo\documents\visual studio 2010\projects\esperiments(class)\esperiments(class)\jogo.cpp(7): warning C4309: 'initializing' : truncation of constant value

corresponde a esta linha de codigo:

char tipo [13] = { '2', '3', '4', '5', '6', '7', '8', '9', '10', 'Q', 'J', 'K', 'A'};

c:\users\ricardo\documents\visual studio 2010\projects\esperiments(class)\esperiments(class)\jogo.cpp(11): error C2144: syntax error : 'void' should be preceded by ';'

corresponde a esta linha de codigo:

void Jogo::BaralhaCartas()

Não tou a entender a razão destes erros...Obrigado

Posted

char tipo [13] = { '2', '3', '4', '5', '6', '7', '8', '9', '10', 'Q', 'J', 'K', 'A'};

'10' <= um caracter com dois caracteres??? Experimenta 'T' (de "Ten")

c:\users\ricardo\documents\visual studio 2010\projects\esperiments(class)\esperiments(class)\jogo.cpp(11): error C2144: syntax error : 'void' should be preceded by ';'

Mete um ; antes do void ...

; void Jogo::BaralhaCartas()

Se calhar gostas mais dele numa linha anterior ... mas aqui tambem funciona.

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted

isto esta-se a tornar penoso xD, os problemas ficaram resolvidos mas apareceram outros ainda mais esquisitos:

main.obj : error LNK2019: unresolved external symbol "public: __thiscall Jogo::Jogo(void)" (??0Jogo@@QAE@XZ) referenced in function _main

c:\users\ricardo\documents\visual studio 2010\Projects\esperiments(class)\Debug\esperiments(class).exe : fatal error LNK1120: 1 unresolved externals

Obrigado pela atenção

Posted

Boas, agora estou com um problema para fazer push_back de um vector de classes, por exemplo, tenho uma classe chamada carta e um vector "vector <carta> Baralho", a classe carta tem 2 variaveis: char naipe e char tipo. Como posso fazer push back num vector deste tipo?

Cumps Ricardo

Fazer push_back é sempre igual. Desde que o argumento que passas ao push_back seja um objecto do tipo que o vector contém, tudo funciona sem problemas. Por exemplo, se tivesses um vector<int>, podias fazer:

vector<int> V;
int x=5;
V.push_back(x);
V.push_back(8);

Em que no primeiro push_back estás a adicionar usando uma variável do tipo int, no segundo caso estás a enviar explicitamente um inteiro.

Se no teu caso tens um vector de objectos da classe "carta", só podes fazer push_back de objectos desse tipo. Caso não tenhas uma variável do tipo carta para adicionar, tens que a criar. A criação de variáveis de tipo "base" em C++ pode-se fazer com mera atribuição do valor. A criação de variáveis que tenham como tipo uma classe, faz-se através de construtores, que recebem argumentos e devolvem uma instância de uma classe inicializada de acordo com esses argumentos.

No caso da classe carta, só faz sentido ter um construtor que receba o naipe e o tipo da carta (ambos char, e ambos essenciais para definir a carta). Depois de teres este construtor definido na tua classe, basta-te usá-lo para criar variáveis do tipo carta e adicioná-las com push_back. Por exemplo, assumindo que o construtor recebe naipe e tipo por esta ordem:

carta x('C','4');
Baralho.push_back(x);

Não respondo a dúvidas por mensagem.

Posted

Se não quiseres correr o risco de fazer disparate podes usar a função da STL como o pmg diz, embora para a tua formação não te faça mal nenhum estudar o algoritmo simples de shuffle que indiquei (e que quase de certeza é o que está implementado na STL).

Já tive a analisar, mas é  possivel adaptar o algoritmo para vectores em vez de arrays?

O exemplo que está no link do pmg é aplicado a vectores...

P.S.: Se essa mensagem era para mim, podes manipular um vector da mesma forma que manipulas um array, a única diferença é que o vector tem redimensionamento automático e uma série de outras funções associadas.

Não respondo a dúvidas por mensagem.

Posted

]estou agora com uma duvida, sobre  o que é e para que serve um construtor de uma classe, eplo que já tive a ver sei que deve ter sempre o mesmo nome que a própria classe, mas ainda nao sei a sua função específica, por exemplo este construtor para que serve?

http://www.cplusplus.com/doc/tutorial/classes/

Enviaste um link que tem muita coisa. A que te referes?

Um construtor serve para inicializar as variáveis de um objecto quando ele é criado. É a primeira coisa que é chamada quando se cria uma variável que tem como tipo essa classe. Da mesma maneira que quando crias um inteiro faz sentido atribuir-lhe um valor (embora não seja obrigatório), quando crias uma carta também faz sentido atribuir-lhe um valor (que neste caso é a combinação tipo/naipe) e isso é feito através do construtor.

Não respondo a dúvidas por mensagem.

Posted

... por exemplo este construtor para que serve?

Um constructor duma classe serve para inicializar uma instância específica da classe. Quando escreves 'Classe * objecto = new Classe();' estás a fazer duas coisas: a reservar espaço para uma instância da classe 'Classe', que será apontado pela variável 'objecto' e a chamar o constructor da classe, que deverá inicializar essa instância. Quando o espaço é reservado é também inicializado a zeros pelo que não precisas de inicializar variáveis da classe a zero ou nulo no constructor, devendo no entanto inicializá-las caso devam-no ser a outro valor.

Mas o constructor não se limita a inicializar variáveis; ele deve inicializar todo o estado da instância, o que pode incluir abrir ficheiros ou sockets, alocar mais memória, criar objectos de sincronização,etc. Tudo o que fôr necessário para começar a usar a instância.

Se bem que não perguntes, o destructor serve para reverter tudo o que o constructor fez que não sejam apenas inicializações de variáveis da classe (fechar ficheiros ou sockets, libertar memória, etc...).

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.