ricardoneves93 Posted May 8, 2012 at 09:12 PM Report #453952 Posted May 8, 2012 at 09:12 PM 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 http://www.speedtest.net/result/2682095343.png
petvetbr Posted May 8, 2012 at 09:26 PM Report #453956 Posted May 8, 2012 at 09:26 PM 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
ricardoneves93 Posted May 8, 2012 at 09:46 PM Author Report #453960 Posted May 8, 2012 at 09:46 PM 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 http://www.speedtest.net/result/2682095343.png
pmg Posted May 8, 2012 at 09:51 PM Report #453964 Posted May 8, 2012 at 09:51 PM 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!
ricardoneves93 Posted May 8, 2012 at 09:56 PM Author Report #453966 Posted May 8, 2012 at 09:56 PM 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 http://www.speedtest.net/result/2682095343.png
ricardoneves93 Posted May 8, 2012 at 10:13 PM Author Report #453970 Posted May 8, 2012 at 10:13 PM Ja resolvi este problema 😄 Obrigado na mesma 😉 http://www.speedtest.net/result/2682095343.png
ricardoneves93 Posted May 9, 2012 at 10:48 AM Author Report #454035 Posted May 9, 2012 at 10:48 AM 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 http://www.speedtest.net/result/2682095343.png
pedrosorio Posted May 9, 2012 at 12:28 PM Report #454050 Posted May 9, 2012 at 12:28 PM 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.
ricardoneves93 Posted May 9, 2012 at 06:58 PM Author Report #454149 Posted May 9, 2012 at 06:58 PM Grande explicação pedrosorio, tudo esclarecido!!! Obrigado!! http://www.speedtest.net/result/2682095343.png
ricardoneves93 Posted May 9, 2012 at 07:55 PM Author Report #454155 Posted May 9, 2012 at 07:55 PM Estou agora com uma duvida em como implementar o random shuffle de modo a baralhar o baralho, já tive a ver em vários forums mas não estou a ver como devo implemtentar esta função!! Obrigado pela Atenção!! http://www.speedtest.net/result/2682095343.png
pedrosorio Posted May 9, 2012 at 08:54 PM Report #454168 Posted May 9, 2012 at 08:54 PM Aconselho-te a usar este algoritmo: http://en.wikipedia.org/wiki/Fisher-Yates_shuffle Tens aqui um grande senhor (Peter Norvig) a explicar o algoritmo em Python: http://www.udacity.com/view#Course/cs212/CourseRev/apr2012/Unit/65002/Nugget/65004 Não respondo a dúvidas por mensagem.
pmg Posted May 9, 2012 at 09:01 PM Report #454173 Posted May 9, 2012 at 09:01 PM Usa std::random_shuffle() declarado no header <algorithm>. 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!
ricardoneves93 Posted May 9, 2012 at 09:02 PM Author Report #454175 Posted May 9, 2012 at 09:02 PM Já tive a analisar, mas é possivel adaptar o algoritmo para vectores em vez de arrays? http://www.speedtest.net/result/2682095343.png
pedrosorio Posted May 9, 2012 at 09:19 PM Report #454176 Posted May 9, 2012 at 09:19 PM 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.
ricardoneves93 Posted May 9, 2012 at 09:52 PM Author Report #454181 Posted May 9, 2012 at 09:52 PM Obrigado pelas vossas dicas, já tenho o baralho baralhado 😉 http://www.speedtest.net/result/2682095343.png
ricardoneves93 Posted May 10, 2012 at 09:16 AM Author Report #454216 Posted May 10, 2012 at 09:16 AM ]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/ http://www.speedtest.net/result/2682095343.png
pedrosorio Posted May 10, 2012 at 10:15 AM Report #454235 Posted May 10, 2012 at 10:15 AM ]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.
ricardoneves93 Posted May 10, 2012 at 10:37 AM Author Report #454241 Posted May 10, 2012 at 10:37 AM Preciso de fazer um construtor para esta classe: class Hand { private: vector <Carta> mao; int SomaValores; public: void SetCarta(); }; #endif Neste caso em particular como ficaria o construtor? http://www.speedtest.net/result/2682095343.png
HappyHippyHippo Posted May 10, 2012 at 10:48 AM Report #454243 Posted May 10, 2012 at 10:48 AM class Hand { private: vector <Carta> mao; int SomaValores; public: void SetCarta(); Hand() { // construtor mao = new vector<Carta>(); // criar o objecto vector SomaValores = 0; // inicializar a zero } }; IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
bsccara Posted May 10, 2012 at 03:00 PM Report #454363 Posted May 10, 2012 at 03:00 PM ... 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...).
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now