Jump to content
Sign in to follow this  
Jedi Gu@rdi@n

[Ajuda] Chamar metodos da classe no source file

Recommended Posts

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 ;)

Edited by Baderous
geshi

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • 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.