Use variable from function outside a class in a method inside a class

Hi, I have trouble making my program to use a string from a function outside of the class in a method inside the class. How do I solve this?
When I type a text in the main and then call the method 'int calcAbs ()' I can make the method work. But when I try to give the file name using the function 'void file_name (string in_file) I can't make it work. The two functions are also working as they should. So what have I forgotten to do?
#include <string>
#include <cctype>
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
 
const int NUMBER_OF_LETTERS = 26;  //A-Z
const int NUMBER_OF_LANGUAGES = 4;
 
class Text
{
private:
  string text ;
  int letters ;
  int other ;
  int n[NUMBER_OF_LETTERS] ;
public:
  Text() ;
  void setText ( string nyText ) ; 
  int calcAbs () ;
  void writeAbs () ;
  void absToRel ( int numb[], double histRel[] ) ;
  void plotRel ( double histRel[] ) ;
  string interpret ( double histRel[] ) ;
} ;
 
void file_name (string &in_file) ;
void read (string &in_file, string &out_string) ;
 
int main()
{
  string text ;
  int numb ;
  Text myText ; 
  
  int number[NUMBER_OF_LETTERS] = { 0 };
  double histRel[NUMBER_OF_LETTERS] = { 0 };   
  
  string in_file ;
  string out_string = "" ; 
  
  file_name (in_file) ;
  read (in_file, out_string) ;
 
  myText.setText ( text ) ;
 
  numb = myText.calcAbs () ;
  myText.writeAbs () ;
  myText.absToRel ( number, histRel ) ;
  myText.plotRel ( histRel ) ;
 
  return 0;
}
// -----------------------------------------------------
Text::Text ()
{
}
// -------------------------------------------------------
void Text::setText ( string newText ) 
{
  text = newText ;
}
// -------------------------------------------------------
int Text::calcAbs ()
{  
  letters = other = 0 ;
 
  for (int i=0; i<(int) text.length(); i++)
  {
    if (isalpha(text.at(i))) letters++ ;
    else other++ ;
  }
  
  cout << "Number of letters in the text is: " << letters << endl ;
 
  for (int i = 0; i < NUMBER_OF_LETTERS; i++ )
       n[i] = 0 ;
 
  for (int i = 0; i < (int) text.length(); i++)
  {
    int index ;
    
    if (text.at(i) >= 'a' && text.at(i) <= 'z')
    {
      index = text.at(i) - 'a'; n[index]++ ;
    }
    if (text.at(i) >= 'A' && text.at(i) <= 'Z')
    {
	    index = text.at(i) - 'A'; n[index]++ ;
    }
  }
  return letters ;
} 
//-----------------------------------------------------------
// The rest of the methods are here...
// Then comes the functions:
//------------------------------------------------------------
void file_name (string &in_file)
{
  string file_ending = ".txt" ;
  
  cout << "Type the name of the file: " << endl ;
  getline ( cin, in_file ) ;
 
  if (in_file.rfind(file_ending) != in_file.length() - 4)
    in_file.append (file_ending) ;
}
// --------------------------------------------------------
void read (string &in_file, string &out_string)
{
  string in_row ;
 
  ifstream fin ( in_file.c_str() ) ;
   
  if ( !fin ) 
  {  
    cout << "The file doesn't exist" << endl ;
    exit ( EXIT_FAILURE ) ;
  } 
 
  while ( getline (fin, in_row) )
  {
    out_string.append(in_row) ;
    out_string.append("\n") ; 
  } 
  text = out_string ;
}

Open in new window

PiaPiaAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

evilrixSenior Software Engineer (Avast)Commented:
>> I can't make it work
What happens?
0
ZoppoCommented:
Hi PiaPia,

as far as I understand the code I think the problem is in the 'read' function - unfortunateley I cannot understand how this can compile at all since I can't see where the 'text' (line 127) is declared - at least it seems as if it is a global variable because it's neither declared in 'read' nor passed to 'read'.

The 'text' you use in 'calcAbs' is a member of the 'Text' class, so it is a different variable than the 'text' set in 'read'.

In 'main' you even use 'text', but here it's a local variable ...

To correct this IMO you just need to change the line 46 to:

> myText.setText ( out_string ) ;


Hope that helps,

ZOPPO
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
PiaPiaAuthor Commented:
Thanks Zoppo! This put me on the right track again! Thought I had tried it all, but obviously not... ;-)
0
ZoppoCommented:
You're welcome - I'm glad I could help ...

have a nice day,

best regards,

ZOPPO
0
evilrixSenior Software Engineer (Avast)Commented:
Zoppo... nice :)
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
System Programming

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.