Ir para conteúdo
Fórum Script Brasil

Castro

Membros
  • Total de itens

    103
  • Registro em

  • Última visita

Tudo que Castro postou

  1. :) Ok. Fiz o seguinte teste: Criei um projeto chamado tela.dev. Nele coloquei os seguintes arquivos: cursor.ccp void gotoxy(int x, int y) { COORD c; c.X = x - 1; c.Y = y - 1; SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c); } posição_tela #include <iostream> #include <windows> using namespace std; int main() { gotoxy(10,20); cout << "posição na tela"; return 0; } Erro O que está errado ? Obrigado
  2. :rolleyes: Estou iniciando aqui um estudo sobre construtores. Considere o programa e seus comentários, pois deles tirarei as perguntas. Os comentários são tirados do livro “C++ guia para iniciantes –Sdhild. Espero que minhas dúvidas sejam úteis para outros... Neste tópico também colocarei algumas dúvidas sobre funções que se relacionarem com os programas. Considere o primeiro programa: #include <iostream> using namespace std; class classe { int valor; public: classe (int i) { valor=i; cout << "Dentro do construtor:\n"; } ~classe() {cout << "Destuindo:\n";} int pegavalor() {return valor;} }; void display (classe obj) { cout << obj.pegavalor() << "\n"; } int main() { classe a(10); cout << "valor ´a´ antes da chamada de display() "; display(a); cout << "Valor de ´a´ depois de display() retornar "; display(a); system ("pause"); return 0; } /* Como você pode ver, há uma chamada para o construtor (que ocorre quando "a" é criado), mas há duas chamadas para o destrutor. Vamos ver porque este é o caso. Quando um objeto é passado para uma função, uma cópia daquele objeto é feita,(e esta cópia se torna o parâmetro da função). Isto siguinifica que um novo objeto passa há existir.Quando a função termina, a cópia do argumento (ou seja, o parâmetro) é destruida. Isto levanta duas per- guntas fundamentais: primeiro, o construtor do objeto é chamado quando a cópia é feita ? segundo, o destrutor do objeto é chamado quando a cópia é destruida ? as respostas a principio, surpreender você. Quando uma cópia de um argumento é feita durante uma chamada de função, o construtor normal não é chamado. Ao invés disto o construtor , o costrutor de cópia do objeto é chamado. Um construtor de cópia define como uma cópia de um objeto é feita. (...) No entanto, se uma classe não definir explicitamente um construtor de cópia, então C++ fornece um por default. O construtor de cópia default cria uma cópia de modo de bit (ou seja identica) do objeto. A razão pela qual uma cópia de modo de bit é feita é fácil de entender se você pensar a respeito. Como um construtor normal é usado para inicializar algum aspecto de um objeto, ele não deve ser chamado para fazer uma cópia de um objeto já existente. Tal chamada alteraria o conteúdo do objeto. Ao passar um objeto para uma função, você quer usar o estado atual do objeto, não seu estado inicial. No entanto,quando a função termina e a cópia do objeto usada como um argumento é destruída, a função destrutor é chamada. Isto é necessário porque o objeto saiu do escopo.É por isso que o programa anterior tinha duas chamadas para o destruidor. A primeira foi quando o parâmetro para display() saiu do escopo. A segunda foi quando "a" dentro de main() foi destruída quando o programa terminou */ 1 – Considerando,que ouve uma segunda chamada de construtor/destrutor defult, isso não explica como o construtor criado, foi ativado, pois dentro de main() não há nenhuma chamada tipo: classe(); ou ~classe(); Como então construtores são ativados, independente de serem de cópia ? basta defini-los dentro da classe ? 2- Se eu defini-los como uma função de classe, ou seja, classe:: classe() { var1=valor1; var2=valor2; }; e usar essas variáveis inicializadas no construtor, poderei usar diretamente em main(), sem precisar chamar o construtor. Pergunto: no caso de construtores como esse, que não são parametrizados, precisa de destrutor ? 3 – Considerando, que o construtor não é parametrizado, para ele destruir os objetos bastaria chamar o construtor vazio ou se deve mencionar as variáveis de alguma forma no destrutor ? 4- No programa acima, há funções como display(), que foram definidas fora da classe, e antes da função main(), percebi, que estas funções não precisam ter o protótipo citado, notei, que se eu declarar o protótipo antes do include, tipo: void display (classe obj); No programa acima, dará erro. Por que ? se estou informando o protótipo e o mesmo não está definido na classe. . 5- O curioso, é que se eu definir essa função abaixo de main(), com protótipo antes do include, e sem relaciona -las a classe, também dará erro. Por quê ? não teria que seguir as regras de C ? 6- O fato de display() não estar prototipada na classe, e ter sido implementada fora dela, indica que display() não é função membro, correto ? Obrigado
  3. :D Tem lógica. Depois eu aplicaria o destrutor neste objeto... Mas se eu visse que esta alteração é válida para o objeto original, como copiar a alteração para o original Obrigado
  4. :D Ok. Deu certo. Mas existe aplicação em C++ para extern ? em C, era um recurso para se ter variável global. O comentário feito está certo ? Existe uma outra aplicação para extern, que diz: extern "C" void myCfunc(); No exmplo e citação acima, fala-se em tratamento diferenciado de função.Pelo que entendi, permite a ultilização de funções criadas em outras linguagens no C++. Correto ? caso tenha entendido certo, como seria isso ? no casso de C para C++ não vejo vantagem, como mostrado. Poderia comentar ? Obrigado
  5. Ok, mas em que momento seria util, fazer cópia de um objeto que já existe ? não seria redundante ? conhece alguma situação prática ? Obrigado
  6. :rolleyes: Não entendi. Munha expectativa, era após declarar o cabeçalho, era poder escrever: gotoxy (5,10); cout << "texto na tela \n"; onde 10 seria a linha 5 a coluna era até uma função muito usada em C. que ficava em conio2.h. tive até que baixar o pacote do DV-C++ na época. Mas que em C++ esteja em outra biblioteca. Pelo que entendi de sua resposta, estaria em windows.h. Entretaanto, imaginava, que bastava chamar o cabeçalho, e usar como indiquei. Não imaginava ter que criar a função, como você mostrou. Creio que meu DEV-C++ seja pára windos, pois rodo debaixo dele.Mas quando rodo meu código vejo tudo na velha tela preta.
  7. :rolleyes: Fiz o teste de duas formas diferentes. 1- Só indiquei o caminho no #include. Não deu certo; 2- Considerei como projeto, e segui as orientações para projeto dev no post 2, deixei o caminho no #include. Não deu certo, 3- Tirei o caminho do #include, e deixei o caminho nas opções de projeto, não deu certo. 4- Tirei o caminho de opções de projeto e voltei a colocar no #include. O que me chamou a atenção, é que os erros mostrados indicam outros problemas referentes ao arquivo .h. Por isso, vou postar o projeto com os erros para vocês verem.Eu realmente uso a IDE para Windows, e isso deve gerar algumas dificuldades. Por falar nisso, o que vocês chamam de: Eu já tive que usar parâmetros para incluir pacotes no DEV-C++, mas.. Eis o projeto Arquivo cpp #include "D:\Sobre_C++\ProgC++funcionando\externa.h" #include <iostream> using namespace std; int main() { cout << PI; system("PAUSE"); return 0; } Arquivo .h extern const double PI 3.1416; // cria uma contante global externa /* O expeciificador extern permite que uma variiável seja conhecida por outro módulo, mas não cria na realidade aquela variável. Em outras palavras, extern que o compilador saiba quais são os tipos e nomes para estas variáveis globais sem na realidade crirar armazenazem para elas novamente. Qundo o linker liga os dois módulos todas as referências são resolvidas*/ Erros: Obrigado
  8. :rolleyes: Vou fazer o teste. Mas achei estranho, pois sempre li, que bastava colocar os arquivos .h e os arquivos .cpp no mesmo diretório. Por que isso ? Certa vez, criei dois arquivos .cpp, onde num coloquei a chamada de iostream, namespace std;, a fumção main() com as chamadas das funções contidas no outro arquivo .cpp, e deu tudo certo. Não deu erro, não precisei nem colocar o protótipo da função num arquivo .h e as funções definidas pelo unuário num arquivo separado do arquivo que contém a função main(), como em programas C. Poderiam explicar o porquê disso ? o procedimento de incluir todo o caminho é válido para todo compilador ou só para o DEV-C++ ? Obrigado
  9. :rolleyes: Considere a citação e o programa abaixo: // atribuindo objetos #include <iostream> using namespace std; class test { int a,b; public: void setab(int i,int j){a=i,b=j;} void showab() { cout << "a e " << a << "\n"; cout << "b e " << b << "\n"; } }; class test2 { int a,b; public: void setab2(int i,int j){a=i*2,b=j*2;} void showab2() { cout << "a e " << a << "\n"; cout << "b e " << b << "\n"; } }; int main() { test ob1, ob2; ob1.setab(10,20); ob2.setab(0,0); cout << "ob1 antes da designacao: \n\n"; ob1.showab(); cout << "\nob2 antes da designacao:\n"; ob2.showab(); cout << "\n"; ob2 = ob1; // atribui ob1 a ob2 cout << "\nob1 depois da designacao:\n"; ob1.showab(); cout << "\nob2 depois da designacao:\n"; ob2.showab(); cout << "\n"; ob1.setab(-1,-1); // modifique ob1 cout << "\nob1 depois da mudanca de ob1:\n"; ob1.showab(); cout << "\nob2 depois da mudanca de ob1:\n"; ob2.showab(); test2 ob3; ob3.setab2(30,40); cout << "\nob3 antes da mudanca:\n"; ob3.showab2(); cout << "\nob1 depois da mudanca de ob3:\n"; ob1=ob3; ob1.showab(); system ("pause"); return 0; } 1- Lendo o texto acima, pode-se deduzir, que se os objetos de classes diferentes podem ser atribuídos. Entretanto, o programa apresenta erro caindo na linha ob1=ob3; erros: Pergunto: as funções e atributos das duas classes não praticamente idênticos ? só muna o nome das funções e o parâmetros são multiplicados na classe test2. O tipo de objetos não permanece o mesmo ? 2- Se eu só puder atribuir objetos dentro de uma mesma classe, qual seria a vantagem desse recurso ? Obvrigado
  10. :rolleyes: Considere o projeto abaixo: Criei um projeto chamado global, que contém dois arquivos: externa.h extern const double PI =3.1416; // cria uma constante global externa E um arquivo principal.cpp #include <iostream> #include "externa.h" using namespace std; int main() { cout << PI; system("PAUSE"); return 0; } para usar a constante global, entretanto, está ocorrendo os seguinte erros: O que está errado ? estou colocando todos os arquivos no mesmo diretório. Obrigado
  11. :rolleyes: Estou tentando demonstrar, que com o operador de resolução de escopo, posso resolver problemas de ambigüidade. O programa abaixo apresenta erro justamente, porque não conseguiu demonstrar isso.Poderiam modificar o programa, de forma a demonstrar, que sem o operador :: , ocorra a ambigüidade e sem ele ocorra ? #include <iostream> using namespace std; class calculo { int a,b; public: calculo(); void a(); int soma(); }; int main() { calculo resultado; resultado.soma(); cout << "\n"; system ("pause"); return 0; } calculo::calculo()// contrutor { a=0;b=0; } int calculo::soma() { int valor; cout << "entre co os dois valorfes da soma\n"; cin >> a >> b; cout << "\n"; valor = a + b; cout << "Total:" << valor; return valor; } void calculo::a() { cout << "Sem valor\n"; } Erros O Compilador, não retornou nenhuma mensagem tipo: “ambiguity in class”, o que indica, que provavelmente eum não consegui criar uma situação de ambigüidade. A idéia é que a ambigüidade seja resolvida com o operador de resolução, e não haja erro. Obrigado
  12. :rolleyes: Sei que para posicionar o cursor em C, é preciso usar a função gotoxy(), colocando o cabeçalho conio2.h, e fazer algumas configurações no DEV-C++, que é o compilador que eu uso. Mas no C++ ? Qual a função que faz isso ? Qual a biblioteca ? Sei que cconio não é, pois não há este equivalente em C++, como há o cctype que corresponde ao ctype.h do C Obigado
  13. :mellow: Ok. Deu certo, mas por que tive que dar o tamanho de 32 na variável binário e não 8 ? pois um byte tem 8 bits ? na sua versão, itoa deu certo sem retornar ponteiros. Poderia comentar ? pois itoa retorna um ponteiro para char. Obriigado
  14. :mellow: Considere o programa: #include <iostream> using namespace std; char mostra_binario(unsigned int u); int main() { int i=1,t; //Deslocamento para esquerda for (t=0; t < 8; t++) { // Deslocamento para a esquerda de 'i' em uma posição mostra_binario(i); i=i << 1; } cout << "\n"; for (t=0; t < 8; t++) { // Deslocamento para a direita de 'i' em uma posição mostra_binario(i); i=i >> 1; } cout << "\n"; system ("pause"); return 0; } char mostra_binario(unsigned int u) { char binario[8]={''},*bin[8],valor[8]; int j; // Aqui se usa ponteiro, pois itoa retorna um ponteiro para caracter *bin=itoa(u,binario,2); for(j=0; j <=8; j++) { valor[j] =*bin[j]; cout << valor[j]; } return valor[j]; } Está dando a seguinte mensagem de erro: Por que isto está acontecendo, se não erro de compilação ? Obrigado
  15. Castro

    Criando uma classe em C++

    :wacko: Ok. Desculpe, mas o fato é que não sei fazer sobrecarca de função, para fazer a recurcividade funcionar. por isso recoloquei o código mom os erros, para partir de um ponto sem erro de digitação. Se puderfazer a sobrecarga para que eu veja como faz agradeço, Entendi que para usar a função com um argumento, sendo declarado dois, é preciso usar sobrecarga. Mas como fazer isso ? Um abraço
  16. :unsure: Eu quando mudei de e_mail fiz a habilitação. Depois que falei com Vocês, recebi a notificação de um post, mas a de vocês não recebi. há histórico de problemas de e_mail de provedor gratuito ? Obrigado
  17. Castro

    Criando uma classe em C++

    :huh: Estou postando a classe com a função e os erros para melhor definir a solução do problema. Ah ! já tirei o terceiro R. class calculando { public: int arranjo (int n, int p); float divisao (float dividendo, float divisor); }; int calculando::arranjo (int n, int p) // Arranjo { int arranj = 0; while (n >= p) { n = (n *(n -1)); p = (p *(p -1)); arranj = arranjo(n)/ arranjo(n - p); }; return arranj; }; Erros: Obrigado
  18. :huh: Estou postando e tendo neus posts respondidos, mas não estu recebendo a notificação. Se a administração do forum puder resolver agradeço Obrigado
  19. Castro

    Criando uma classe em C++

    :wacko: Quando você diz: Não entendi a parte do texto em vermelho. Como faço uma chamada de arranjo que não exiiste ? quando faço: arranj = arrranjo(n)/ arranjo(n - p); não estou chamando a função ? não estou entendendo. Poderia demonstrar ? Obrigado
  20. :wacko: O que está errado na lógica do método arranjo ? estou usando recursividade, mas também está dando erro na recursividade. Por quê ? Arquivo .h ========= class calculando { public: int fatorial (int fat); float soma ( float num1, float num2); int arranjo (int n, int p); }; int calculando::arranjo (int n, int p) // Arranjo { int arranj = 0; while (n >= p) { n = (n *(n -1)); p = (p *(p -1)); arranj = arrranjo(n)/ arranjo(n - p); }; return arranj; };. Arquivo .cpp ========== #include <iostream> #include "calculo.h" using namespace std; int main() { int Nfat,valorN, valorP; float Nsomando1,Nsomando2; calculando minhaclasse; // definindo a ocorrência da classe calculo cout << "Entre com o valor para aplicar o fatorial" << endl; cin >> Nfat; cout << "fatorial de " << Nfat << endl; cout << minhaclasse.fatorial(Nfat)<< endl; cout << "Entre com Valor de N e Valor de P callcular o arranjo" << endl; cin >> valorN; cin >> valorP; cout << "Valor do Arranjo " << minhaclasse.arranjo (valorN,valorP) << endl; cout << "Entre com os valore para fazer a soma" << endl; cin >> Nsomando1; cin >> Nsomando2; cout << "Valor da soma de " << Nsomando1 << " + " << Nsomando2 << endl; cout << minhaclasse.soma(Nsomando1,Nsomando2) << endl; system ("pause"); return 0; } Obrigado
  21. :( Como faço para mudar meu e_mail de resposta ? procurei o painel de controle para fazer a alteração, mans não encontrei. poderia indicar onde está essa opção ?
  22. :( Kandrade, Ok. Mudei para public e deu certo. Mas fique curioso. Se não for difícil você poderia criar os métodos set e get em meu código ? não tenho idéia de como fazer isso. Nas apostilas de C++ que peguei na Internet não vi essa abordagem. Só sei, que manter os atributos da classe como private é o mais correto. Poderia lançar alguma lluz sobre a criação desses métodos ? Já li algo sobre setw, mas acho que não é disso que se está falando. Obrigado
  23. :( Estou com dificuldade de criar classes em C++ Estou tendo dificuldades com acesso. Por favor vejam o projeto. Se puderem eliminar ao erros apontados agradeço Criei o seguinte projeto o seguinte projeto Arquivo metodoestatico.cpp #include "metodoestatico.h" //---------------------------------------------------------Arquivo main.cpp int main () { string linha = "--------------------------------------------------------------\n"; cout << "Entre com o número de alunos da disciplina (ex =3):"; int numeroAlunos; cin >> numeroAlunos; cin.get (); //Cria um objeto do tipo TPessoa com nome professor TPessoa professor; //Cria um vetor de objetos alunos do tipo TPessoa vector < TPessoa > aluno ( numeroAlunos); cout << "Entre com o nome do professor: "; getline (cin, professor.nome); cout << "Entre com a matricula do professor: "; getline (cin, professor.matricula); for (int contador = 0; contador < aluno.size (); contador++) { cout << "Aluno " << contador << endl; aluno[contador].Entrada (); } cout << linha; cout << "RELAÇÃO DE PROFESSORES E ALUNOS : " << endl; cout << linha; cout << "Nome do professor: " << professor.nome << "\n"; cout << "Matricula : " << professor.matricula << "\n"; for (int contador = 0; contador < aluno.size (); contador++) { cout << linha; cout << "Aluno " << contador << endl; aluno[contador].Saida (); } cin.get (); return 0; } ============================== Arquiivo metodoestático.h // ---------------------------------------------------------Arquivo TAluno.h // ---------------------------------------------------------Bibliotecas C/C++ #include <iostream> #include <string> #include <vector> using namespace std; // ---------------------------------------------------------Classe /* A classe TPessoa representa uma pessoa (um aluno ou um professor) de uma universidade. Tem um nome, uma matricula e um IAA. E métodos básicos para entrada e saída de dados. */ class TPessoa { // ---------------------------------------------------------Atributos private: std::string nome; std::string matricula; float iaa; private: static int numeroAlunos; public: // ---------------------------------------------------------Métodos //Método do objeto , altera as propriedades do objeto //Leitura dos atributos (nome, matricula) void Entrada (); //Saida dos atributos ( nome, matricula, iaa) void Saida () const; //Um método estático só pode alterar atributos estáticos static int GetnumeroAlunos () { return numeroAlunos; } }; /* // Atributo estático é aquele que pertence a classe e não ao objeto //e precisa ser definido depois da classe */ //int TPessoa:: numeroAlunos = 0; ‘============================================== Arquivo Taluno.cpp #include "metodoestatico.h" int TPessoa::numeroAlunos = 0; //---------------------------------------------------------Arquivo TAluno.cpp // Definição dos métodos void TPessoa::Entrada () { cout << "Entre com o nome do aluno: "; getline (cin, nome); cout << "Entre com a matricula do aluno: "; getline (cin, matricula); cout << "Entre com o IAA do aluno: "; cin >> iaa; cin.get (); } void TPessoa::Saida () const { cout << "Nome do aluno: " << nome << endl; cout << "Matricula : " << matricula << endl; cout << "iaa : " << iaa << endl; } Erros: Esta caindo na linha std::string nome; do arquivo metodoestatico com as seguintes mensagens: Obriigado
  24. :D Considerem, a duas versões do mesmo programa. Ambas funcionam. Foram postas apenas para ilustrar a duvida, e facilitar a resposta. Versão 1: #include <stdio.h> #include <stdlib.h> void Escrevenum(int (*func)(int*, int*, int*) ); int Textonum(int* num1, int* num2, int* num3 ); int main () { int (*p)(int*, int*, int*); /* Cria ponteiro para a função e define seu parametro como tipo char*/ p = Textonum; /* Atribui a função texto ao ponteiro p*/ Escrevenum( p ); /* Passa ponteiro para a função como referencia*/ system ("pause"); return 0; } void Escrevenum( int (*func)(int*, int*, int*) ) { int a=1,b=2,c=3; func(&a, &b, &c); /* Executa função que foi passada como referencia */ return; } int Textonum(int* num1, int* num2, int* num3 ) { printf("%d %d %d\n", *num1, *num2, *num3); return (0); } Versão 2: #include <stdlib.h> void Escrevenum(int (*func)(int, int, int) ); int Textonum(int num1, int num2, int num3 ); int main () { int (*p)(int, int, int); /* Cria ponteiro para a função e define seu parametro como tipo char*/ p = Textonum; /* Atribui a função texto ao ponteiro p*/ Escrevenum( p ); /* Passa ponteiro para a função como referencia*/ system ("pause"); return 0; } void Escrevenum( int (*func)(int, int, int) ) { func(1, 2, 3); /* Executa função que foi passada como referencia */ return; } int Textonum(int num1, int num2, int num3 ) { printf("%d %d %d\n", num1, num2, num3); return (0); } Como dito acima, ambas funcionam, entretanto, se diz, que a versão mais correta, é a segunda, isto porque o correto, seria usar ponteiros com parâmetros, quando se usa strings ou tipo char, e não com tipos numéricos. Gostaria de saber o porquê.
×
×
  • Criar Novo...