Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

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

Posted on 2009-07-10
5
Medium Priority
?
538 Views
Last Modified: 2013-11-17
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

0
Comment
Question by:PiaPia
  • 2
  • 2
5 Comments
 
LVL 40

Expert Comment

by:evilrix
ID: 24822268
>> I can't make it work
What happens?
0
 
LVL 31

Accepted Solution

by:
Zoppo earned 1000 total points
ID: 24822344
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
 

Author Comment

by:PiaPia
ID: 24822666
Thanks Zoppo! This put me on the right track again! Thought I had tried it all, but obviously not... ;-)
0
 
LVL 31

Expert Comment

by:Zoppo
ID: 24822679
You're welcome - I'm glad I could help ...

have a nice day,

best regards,

ZOPPO
0
 
LVL 40

Expert Comment

by:evilrix
ID: 24822691
Zoppo... nice :)
0

Featured Post

Vote for the Most Valuable Expert

It’s time to recognize experts that go above and beyond with helpful solutions and engagement on site. Choose from the top experts in the Hall of Fame or on the right rail of your favorite topic page. Look for the blue “Nominate” button on their profile to vote.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction: Dialogs (1) modal - maintaining the database. Continuing from the ninth article about sudoku.   You might have heard of modal and modeless dialogs.  Here with this Sudoku application will we use one of each type: a modal dialog …
In this post we will learn different types of Android Layout and some basics of an Android App.
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.
Suggested Courses

773 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question