• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Wasted

Classes...

8 mensagens neste tópico

Boas, quis fazer umas revisoes pois vo ter um teste a programação amanha e quis rever as classes...o problema é que este programa nao me corre as funções que mostro abaixo :\ Podiam me explicar o que está de mal? Basicamente isso era uma class de arrays dinâmicos, para se poder mudar os tamanhos de livre  vontade.

Eis o codigo:

#include<iostream>
using namespace std;

class arrays {
  int *array;
  int tamanho;

public:
  void mudar_tamanho(int tamanho1);
  void mostrar_array();
  arrays(int tamanho1){tamanho=tamanho1;};
};


void arrays::mudar_tamanho(int tamanho1) {
  
  delete [] array;   
  array=new int[tamanho1];
  
  for(int i=0;i<=tamanho1;i++)
    array[i]=i;
  tamanho=tamanho1;
}

void arrays::mostrar_array() {
  int i;
  
     for(i=0;i<tamanho;i++)
       cout<<array[i];
}

int main() {
  arrays b(5);
  int novotamanho,dummy;
  
  cout<<"Indique o tamanho do vector";
  cin>>novotamanho;
  b.mudar_tamanho(novotamanho);
  cin>>dummy;
  
}
  

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

No construtor deves inicializar o campo "array" da classe a NULL. Visto que crias um objecto local à função main, os valores dos seus atributos tem um valor qualquer, desconhecido (assim como se passa com as variaveis de tipos primitivos).

Também acho que logo no construtor devias mudar o tamanho do array porque se não a informação é um pouco inconsistente: no teu exemplo dás um valor inicial de 5 ao tamanho, mas o array continua na mesma. Tens sempre a hipotese de inicializar o tamanho a 0 ( e array = NULL ).

Assim, ao fazeres o delete, o valor do apontador do array vai endereçar um endereço de memória que não pertence ao teu programa e o programa estoura.

Por fim, as funções que defines no header da classe (como o construtor da classe neste caso) não precisam do ";" no fim (embora isto não dê erro).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pronto ja fiz as modificações, o programa começa a correr, vai até ao cout para mudar o tamanho, mas depois nao me entra na função :S eu infelizmente ainda sou um bocado nabo com os ponteiros, nao estou a entender pq é que nao me está a entrar na função mudar_tamanho

#include<iostream>
using namespace std;

class arrays {
  int *array;
  int tamanho;

public:
  void mudar_tamanho(int tamanho1);
  void mostrar_array();
  arrays(int tamanho1);
};


arrays::arrays(int tamanho1){
  array=new int[tamanho1];
  for(int i=0;i<=tamanho1;i++)
    array[i]=i;
  tamanho=tamanho1;
}
  
void arrays::mudar_tamanho(int tamanho1) {
  
  delete [] array;   
  array=new int[tamanho1];
  
  for(int i=0;i<=tamanho1;i++)
    array[i]=i;
  tamanho=tamanho1;
}

void arrays::mostrar_array() {
  int i;
  
     for(i=0;i<tamanho;i++)
       cout<<array[i];
}

int main() {
  arrays vec(5);
  int novotamanho,dummy;
  
  cout<<"Indique o tamanho do vector";
  cin>>novotamanho;
  vec.mudar_tamanho(novotamanho);
  cin>>dummy;
  
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ele entrar na função deve entrar, o problema é logo ao fazer o delete [] como no construtor são preenchidos elementos no array além do seu limite deve estar a acontecer algum erro de memória.

Já agora no método mudar_tamanho também tens o for a andar 1 elemento a mais. Tens que por < e não <=.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Correcto. O array não deve ser criado em mudar_tamanho. O construtor deve ser chamado em vez disso.

Também, a classe não tem nenhum destructor. Deve ter e array deve ser apagado aí, caso contrário... memory leak.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O array não deve ser criado em mudar_tamanho.

O construtor de uma classe nunca deve ser chamado explicitamente. Nem o destrutor.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

para mim o código que esta feito esta correcto a excepção de que o numero de elementos do for tem de ser menor que o tamanho máximo do array, pois senão iremos ter problemas de acesso a memoria uma vez que estamos a ultrapassar o tamanho máximo que definimos quando dissemos ao new para criar.

se reparares na tua penúltima função a mostrar_arrays

void arrays::mostrar_array() {
  int i;

     for(i=0;i<tamanho;i++)
       cout<<array[i];
}

assim esta correcto o for nas outras funcoes so iras ter de substituir o tamanho por tamanho1 e funciona bem, uma vez que nao tens <= dentro do for mas < que .

boas programações espero ter ajudado em alguma coisa. o thedark tem razão não devemos estar a pedir explicitamente o construtor.

0

Partilhar esta mensagem


Link 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