Ir para o conteúdo
Jedi Gu@rdi@n

[Ajuda] Chamar metodos da classe no source file

Mensagens Recomendadas

Jedi Gu@rdi@n    0
Jedi Gu@rdi@n

Boas estou a iniciar-me no c++ e tenho aqui um pequeno programa elaborado para trabalhar com lists e iteradores.

Consiste num editor de texto onde se podem acrescentar linhas de texto, juntar linhas, apagar, etc...

Tenho uma classe com os metodos pretendidos e estou a ter dificuldades em chamar esses metodos na main.cpp.

O codigo e compilado e nao da erro, mas assim que escolho uma opçao no menu o programa deixa de dar. Suponho que esteja relacionado com o modo como chamo os metodos na source file, mas nao estou a ver bem onde esta o problema.

#include <list>
class EditorTexto
{
list<string> l1;
public:
EditorTexto(); //Construtor pre definido
EditorTexto(list<string> lista1); //Construtor de instancias
EditorTexto(const EditorTexto &et);//Construtor cópia
~ EditorTexto(); //Destrutor
void InserirLinhas();
void EliminarLinhas();
void JuntarLinhas();
int ContarLinhas();
int ContarCaracteres();
void DeterminarComprimentoLinha();
void SubstituirLinha();
};
EditorTexto::EditorTexto() //Construtor pre definido (reset variaveis)
{
}
EditorTexto::EditorTexto(list<string> lista1) //Construtor Instancias (reset variaveis)
{
l1=lista1;
}
EditorTexto::EditorTexto(const EditorTexto &et) //Construtor cópia
{
l1 = et.l1;
}
EditorTexto::~EditorTexto() //Destrutor
{}
void EditorTexto::InserirLinhas()
{
string newstring;
do
{
cout << "Insira novo conteudo: ";
getline(cin,newstring);
l1.push_back(newstring);
}
while (newstring != "");

}

void EditorTexto::EliminarLinhas()
{
int nlinha;
cout << "Que linha quer eliminar? ";
cin >> nlinha;
int n=0;

for (list<string>::iterator it = l1.begin(); it != l1.end(); it++)
{
n++;
if( n == nlinha)
{
l1.remove(*it);
cout << *it << "\n";
}
}
}
void EditorTexto::JuntarLinhas()
{
int nlinha=0;
int n=0;
cout << "Que linha quer juntar? ";
cin >> nlinha;

for (list<string>::iterator it = l1.begin(); it != l1.end(); it++)
{
n++;
if( n == nlinha)
{
 string s1 = (*it);
it++;
string s2 = *it;
s1 += s2;
--it;
*it = s1;
cout << *it << "\n";
}
}
}
int EditorTexto::ContarLinhas()
{
return l1.size();
}
int EditorTexto::ContarCaracteres()
{
int charSize;
for (list<string>::iterator it = l1.begin(); it != l1.end(); it++)
{
 charSize += (*it).size();
}
return charSize;
}

void EditorTexto::DeterminarComprimentoLinha()
{
int max=0;
int charSize=0;
for (list<string>::iterator it = l1.begin(); it != l1.end(); it++)
{
 charSize = (*it).size();
 if (charSize > max)
 {
	 max = charSize;
	 cout << "A linha maior tem" << max <<" linhas";
 }
 else
 {
		 cout << "A linha maior tem" << charSize <<" linhas";
 }
 }
}


void EditorTexto::SubstituirLinha()
{
int nlinha;
int n= 0;
string newstring;
cout << "Que linha quer substituir? ";
cin >> nlinha;
for (list<string>::iterator it = l1.begin(); it != l1.end(); it++)
{
n++;
if( n == nlinha)
{
l1.remove(*it);
cout << "Insira novo conteudo. "<< endl;
cin >> newstring;
getline(cin,newstring);
l1.push_back(newstring);
cout << *it << "\n";
}
}
}


#include <iostream>
#include <string>
using namespace std;
#include "EditorTexto.h"
int main()
{
int opcao;
//EditorTexto et;
cout << ":::::::::::::::::::::::::::::::"<<endl;
cout << ":: 1-Inserir linhas		 ::"<<endl;
cout << ":: 2-Eliminar linhas		 ::"<< endl;
cout << ":: 3-Juntar linhas		 ::"<< endl;
cout << ":: 4-Contar linhas		 ::"<< endl;
cout << ":: 5-Contar Caracteres	 ::"<< endl;
cout << ":: 6-Determinar linha maior ::"<< endl;
cout << ":: 7-Substituir linhas	 ::"<< endl;
cout << ":::::::::::::::::::::::::::::::"<<endl;
cout << "Insira opcao desejada: ";
cin >> opcao;
switch(opcao)
{
 case 1:
	 et.InserirLinhas();
	 break;
 case 2:
	 et.EliminarLinhas();
	 break;
 case 3:
	 et.JuntarLinhas();
	 break;
 case 4:
	 et.ContarLinhas();
	 break;
 case 5:
	 et.ContarCaracteres();
	 break;
 case 6:
	 et.DeterminarComprimentoLinha();
	 break;
 case 7:
	 et.SubstituirLinha();
	 break;
 default:
	 cout << "Insira opcao desejada";
	 cin >> opcao;
 break;

}
}

Agradeço desde já a vossa ajuda.

Cumps ;)

Editado por Baderous
geshi

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

1º - isso não pode compilar ... tens a linha de declaração do objecto "et" comentada

2º - é impossivel ler isso com a indentação que tens

3º - usa as tags do geshi para dar o highlight correcto ao código apresentado no fórum


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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
ruirodrigues1971    2
ruirodrigues1971

Concordando com o anterior comentário ;) ... e complementando :cheesygrin: .

No Main usando a tua ideia ... tens de criar o objecto .... ou seja essa linha que está comentada tem de deixar de estar comentada :cheesygrin:

//EditorTexto et;

-->

EditorTexto et; //chamada do construtor por defeito;

e por alto estás estás a cometer erros nos construtores ... estás a copiar as referência de objectos externos (o que poderá ocorrer

erros numa aplicação a sério pois o controlo desses objectos passam a ser partilhadas por vários objectos ... e fica uma confusão).

Aconselho-te a criar estruturas internas clones dos objectos externos.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
eatg75    21
eatg75

Boa noite estive a ver o teu codigo tens alguns erros e algumas 'mas praticas', comentei os erros e as mas praticas que consegui encontrar.

NOTA : se realmente quiseres que alguem te ajude na proxima(s) vez(es) indenta a listagem do teu codigo.

listagem 1 :

#include <list>
class EditorTexto {
 list<string> l1;
public:
 EditorTexto(); //Construtor pre definido
 EditorTexto(list<string> lista1); //Construtor de instancias
 EditorTexto(const EditorTexto &et);//Construtor cópia
 ~EditorTexto(); //Destrutor
 void InserirLinhas();
 void EliminarLinhas();
 void JuntarLinhas();
 int ContarLinhas();
 int ContarCaracteres();
 void DeterminarComprimentoLinha();
 void SubstituirLinha();
};
EditorTexto::EditorTexto() { } //Construtor pre definido (reset variaveis)
EditorTexto::EditorTexto(list<string> lista1) { //Construtor Instancias (reset variaveis)
 l1 = lista1;
}
EditorTexto::EditorTexto(const EditorTexto& et) {  //Construtor cópia
 l1 = et.l1; // suponhamos que instanciacao do variavel membro l1 e feita na HEAP no contrutor e
		  // e destruida no destrutor do EditorTexto quando a variavel do tipo EditorTexto o qual
		  // foi passado como parametro a esta operacao sair do escopo o dealocado o acesso ao membro l1
		  // sera invalido.
}
EditorTexto::~EditorTexto() { } //Destrutor
void EditorTexto::InserirLinhas() {
 string newstring; // inicializa as variaveis

 do {
   cout << "Insira novo conteudo: ";
   getline(cin,newstring);
   l1.push_back(newstring);
 } while (newstring != "");
}
void EditorTexto::EliminarLinhas() {
 int nlinha; // apesar de estares a ler este valor do teclado seria uma boa pratica inicializar as variaveis.
 cout << "Que linha quer eliminar? ";
 cin >> nlinha;
 int n = 0;
 // tinhan anteriormente como primeira instrucao deste ciclo for : n++, o que implica
 // a linha numero zero jamais seria eliminada, e por isso que e uma boa pratica realizar
 // as instrucoes de incrimento no fim de cada iteracao do ciclo, neste caso como se trata do
 // do 'for' tens duas opcoes, a primeira seria colocar a essa instrucao no fim do ciclo, neste
 // caso logo a seguir da instrucao 'if', a segunda opcao e colocar essa instrucao na seccao 'afterthought'
 // do ciclo for juntamento com o incremento do iterador, eu pessoalmente recomendaria e sou a favor
 // da segunda solucao.
 for (list<string>::iterator it = l1.begin(); it != l1.end(); ++it, ++n) {	  
   if(n == nlinha) {
  l1.remove(*it);
  cout << *it << "\n";
   }
 }
}
void EditorTexto::JuntarLinhas() {
 int nlinha = 0;
 int n = 0;
 cout << "Que linha quer juntar? ";
 cin >> nlinha;
 // ver o o comentario na operacao 'EliminarLinhas()'.
 for (list<string>::iterator it = l1.begin(); it != l1.end(); it++) {
   n++;
   if( n == nlinha) {
  string s1 = (*it);
  it++;
  string s2 = *it;
  s1 += s2;
  --it;
  *it = s1;
  cout << *it << "\n";
   }
 }
}
int EditorTexto::ContarLinhas() {
 return l1.size();
}
int EditorTexto::ContarCaracteres() {
 int charSize; // as variaveis nao sao inicializadas com um valor por omissao
		    // esta variavel tem um valor aleatorio, certamente esta operacao
		    // nao esta a comportar como pretendias.
 for (list<string>::iterator it = l1.begin(); it != l1.end(); it++) {
  charSize += (*it).size();
 }
 return charSize;
}
void EditorTexto::DeterminarComprimentoLinha() {
 int max = 0;
 int charSize = 0;
 for (list<string>::iterator it = l1.begin(); it != l1.end(); it++) {
  charSize = (*it).size();

  if (charSize > max) {
  max = charSize;
  cout << "A linha maior tem " << max << " linhas"; // porque que nao fazes a escrita para o output no final do ciclo
												 // esta instrucao escreve para o ecra toda a vez que e incontrada
													    // uma nova linha maior. Sera que e isso que queres?
  }
  else {
cout << "A linha maior tem " << charSize << " linhas"; // porque estar a escrever em toda as iteracoes o tamanho da maior linha?
												    // lembra que esta mensagem sera escrita (n - i) vezes, sendo a n o numero de
												    // linhas e i o numero de linha em que a maior linha foi encontrada. Sera que e isso
												    // que queres tambem?
  }
   }
}

void EditorTexto::SubstituirLinha() {
 int nlinha; // inicializa as variaveis!
 int n = 0;
 string newstring; // inicializa as variaveis!
 cout << "Que linha quer substituir? ";
 cin >> nlinha; 
 // ver o o comentario na operacao 'EliminarLinhas()'.
 for (list<string>::iterator it = l1.begin(); it != l1.end(); it++) {
  n++;
  if(n == nlinha) {
  l1.remove(*it);
  cout << "Insira novo conteudo." << endl;
  cin >> newstring;
  getline(cin,newstring);
  l1.push_back(newstring); // nao estas a substituir linha. estas a inserir uma linha no fim da lista,
					    // logo nao estao a fazer o que esta operacao supostamente deve fazer.
  cout << *it << "\n";
}
   }
}

listagem 2:

#include <iostream>
#include <string>
using namespace std;
#include "EditorTexto.h"
int main() { // e as variaveis que contem o numero dos parametros de linha de comando passados ao teu programa, assim como
	   // a variavel com esses valores.
 int opcao; // inicializa as variaveis!
 //EditorTexto et;
 cout << ":::::::::::::::::::::::::::::::" << endl;
 cout << ":: 1-Inserir linhas			 ::" << endl; // porque nao utilizas o manipulador std::setw()
												    // para definar a largura ao inves de colocar espacos?
 cout << ":: 2-Eliminar linhas		    ::" << endl;
 cout << ":: 3-Juntar linhas			  ::" << endl;
 cout << ":: 4-Contar linhas			  ::" << endl;
 cout << ":: 5-Contar Caracteres  ::" << endl;
 cout << ":: 6-Determinar linha maior ::" << endl;
 cout << ":: 7-Substituir linhas  ::" << endl;
 cout << ":::::::::::::::::::::::::::::::" << endl;
 cout << "Insira opcao desejada: ";
 cin >> opcao;

 switch(opcao) {
   case 1:
  et.InserirLinhas(); // onde esta declaracao e inicializacao desta variavel?
  break;
   case 2:
  et.EliminarLinhas();
  break;
   case 3:
  et.JuntarLinhas();
  break;
   case 4:
  et.ContarLinhas();
  break;
   case 5:
  et.ContarCaracteres();
  break;
   case 6:
  et.DeterminarComprimentoLinha();
  break;
   case 7:
  et.SubstituirLinha();
  break;
   default:
  cout << "Insira opcao desejada : ";
  cin >> opcao;
  break;
   }
}


Victarion seized the dusky woman by the wrist and pulled her to him.

Victarion - She will do it. Go pray to your red god. Light your fire, and tell me what you see.

Moqorro's dark eyes seemed to shine.

Moqorro - I see dragons.

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


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.