title: How can I keep variables from being re-initialized every time I call a C++ function?
body: <p>How do I get past this variable initialization problem? If I only could figure out how to only initialize them only once...</p>
  
  <pre><code>*   Main.cpp : main project file.
  
  
  /**************************   Begin Header **************************/
  #include "stdafx.h" //Required by Visual C ++
  #include &lt;string&gt;   //Required to use strings
  #include &lt;iostream&gt; //Required for a bunch of important things
  #include &lt;iomanip&gt;  //Required for manipulation of text and numbers
  
  
  using namespace System; // Automatically uses System namespace
  using namespace std;    // Automatically uses std namespace
  
  
  #pragma hdrstop // Stops header here
  /***************************  End Header ***************************/
  
  //* Begin Function Headers *//
  void inputData(); // This will be used to organize class member calls when setting and getting new data.
  int getData(); // Will get user data, input in character string, convert to an integer and then perform data validation.
  void createReport(int place, int number, string type); // Will organize commands to create the report and display it on the screen.
  //* End Function Headers *//
  
  
  
  class JarsSold // Begin Class -- JarsSold
  {
      /* Begin Initialization &amp; Creation of important resources */
  private:
      static const int MaxArray = 5; // Value for the size of array JARS_SOLD
      int JARS_SOLD[MaxArray]; // Creation of array with size of MaxArray
      /* End Initialization &amp; Creation of important resources */
  public: // Makes underlining elements Public instead of the default Private
      JarsSold() // Begin Constructor
      { // Put something in num array
        JARS_SOLD[0] = 0; // [1]
        JARS_SOLD[1] = 0; // [2]
        JARS_SOLD[2] = 0; // [3]
        JARS_SOLD[3] = 0; // [4]
        JARS_SOLD[4] = 0; // [5] 
      } // End Constructor
      ~JarsSold(){}; // Destructor
  
  /* Put all members for JarsSold class below here */
  
      void setNumber(int num, int value) // Set the number of jars sold with number placement in array and value to replace it with
      {
          JARS_SOLD[num] = value; // Stores value into JARS_SOLD at whatever num is at the time
      }; // End setNumber class member
  
      int getNumber(int num) // Get the current number held for jars sold with number placement in array
      {
          return JARS_SOLD[num]; // Returns whatever is in JARS_SOLD depending on what num is at the time
      } // End getNumber class member
  
  
  /* Put all members for JarsSold class above here */
  
  }; // End Class -- JarsSold
  
  
  
  
  class SalsaTypes // Begin Class -- SalsaTypes
  {
      /* Begin Initialization &amp; Creation of important resources */
  private:
      static const int MaxArray = 5; // Value for the size of array JARS_SOLD
      string SALSA_TYPES[MaxArray]; // Creation of array with size of MaxArray
      /* End Initialization &amp; Creation of important resources */
  
  public: // Makes underlining elements public instead of the default Private
      SalsaTypes() // Begin Constructor
      { // Add default strings to str array
        SALSA_TYPES[0] = "Mild";   // [1] Stores Mild into SALSA_TYPES at 0 spot
        SALSA_TYPES[1] = "Medium"; // [2] Stores Medium into SALSA_TYPES at 1 spot
        SALSA_TYPES[2] = "Sweet";  // [3] Stores Sweet into SALSA_TYPES at 2 spot
        SALSA_TYPES[3] = "Hot";    // [4] Stores Hot into SALSA_TYPES at 3 spot
        SALSA_TYPES[4] = "Zesty";  // [5] Stores Zesty into SALSA_TYPES at 4 spot
      } // End Constructor
      ~SalsaTypes(){}; // Destructor
  
  /* Put all members for SalsaTypes class below here */
      void setType(int num, string type) // Set salsa type with number placement in array and string value to replace with
      {
          SALSA_TYPES[num] = type; // Stores the string type into SALSA_TYPES at whatever num is at the time
      }; // End setType class member
  
      string getType(int num) // Get the Salsa Type with number placement in array
      {
          return SALSA_TYPES[num]; // Returns SALSA_TYPES depending on what is in num at the time
      }; // End getType class member
  /* Put all members for SalsaTypes class above here */
  
  };// End Class -- SalsaTypes
  
  
  void main( void ) // Begin Main Program
  {
  
  
  
  cout &lt;&lt; fixed &lt;&lt; setprecision(1) &lt;&lt; setw(2); // Do a little customization with IoManip, might as well, we just might need it
  
      // Main Program Contents Begin Here //
  
      // Opening Credits for Program
      cout &lt;&lt; "Welcome to the /Professional Edition\\ of the Chip and Salsa Sale Tool EXPRESS." &lt;&lt; endl;
      cout &lt;&lt; "This handy-dandy tool will make a chip and salsa manufacturer's job much easier!" &lt;&lt; endl;
      cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; endl;
      cout &lt;&lt; "Press any key to begin inputing the number of jars sold for these salsa flavors: " &lt;&lt; endl &lt;&lt; endl;
      cout &lt;&lt; "-Mild" &lt;&lt; endl &lt;&lt; "-Medium" &lt;&lt; endl&lt;&lt; "-Sweet" &lt;&lt; endl &lt;&lt; "-Hot" &lt;&lt; endl &lt;&lt; "-Zesty" &lt;&lt; endl &lt;&lt; endl &lt;&lt; endl;
  
      system("pause"); // Pause here. After this begin data input
      cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; endl;
  
      inputData(); // Will deal with data input, validation, and reports
  
      // Main Program Contents End Here //
  
  } //End Main Program
  
  // All Content for Functions Begin Here //
  void inputData() // Begin inputData Function
  {
      // Begin Create Class Obects //
      SalsaTypes salsa;
      JarsSold jars;
      // End Create Class Objects //
      // Variable Creation Begin //
      // Variable Creation End //
      // All Content for Functions Begin Here //
  
      for (int i = 0 ; i &lt; 5 ; i++) // Start For Loop
      {
          cout &lt;&lt; "Input how many Jars were sold for \"" &lt;&lt; salsa.getType(i) &lt;&lt; "\"" &lt;&lt; ": "; // Displays which Salsa we are reffering to
  
          jars.setNumber(i,getData()); // Will use getData() to determine what value to send to the JarsSold class.
          createReport(i,jars.getNumber(i),salsa.getType(i)); // Send these numbers to another function so it can make a report later
  
          cout &lt;&lt; endl &lt;&lt; endl; // Using this as a spacer
      }
  
      // All Content for Functions End Here //
  
  }; // End inputData Function
  
  int getData() // Begin getData Function
  {
      // Variable Creation Begin //
      char charData[40]; // Will be used to store user data entry
      int numTest; // Will be used for Data Validation methods
      // Variable Creation End //
  
      // Main Contents of Function Begin Here //
  retry: // Locator for goto command
  
      cin &gt;&gt; charData; // Ask user for input. Will store in character string then convert to an integer for data validation using 'Atoi'
  
      numTest = atoi ( charData ); // Convert charData to integer and store in numTest
  
      if (numTest &lt; 0) { numTest = 0; cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; "You can't enter negative numbers! Try Again." &lt;&lt; endl &lt;&lt; endl &lt;&lt; "Re-enter number: "; goto retry;} // Filter out negative numbers
  
      // Main Contents of Function End Here //
  
      return numTest; // If it makes it this far, it passed all the tests. Send this value back.
  }; // End getData Function
  
  void createReport(int place, int number, string type) // Begin createReport Function
  {
      // Variable Creation Begin //
  
      int const MAX = 5;  // Creat array size variable
      int lowest; // The integer it will use to store the place of the lowest jar sales in the array
      int highest; // The integer it will use to store the place of the highest jar sales in the array
      int total; // The integer it will use to store total sales
      int numArray[MAX];  // Create array to store jar sales (integers)
      string typeArray[MAX];  // Create array to store types of salsa (strings)
  
      // Variable Creation End //
      // Main Contents of Function Begin Here //
  
      numArray[place] = number; // Store number into new array
      typeArray[place] = type;    // Store type into new array
  
      if (place = 4) // If the array is full it means we are done getting data and it is time to make the report.
      { // Begin making report, If statement start
  
          for ( int i = 0 ; i &lt; 5 ; i++ ) // Using a for-loop to find the highest and lowest value in the array
          { // For Loop to find high and low values BEGIN
              if ( lowest &lt; numArray[i]) // Keep setting lowest to the lowest value until it finds the lowest one
              { // Start If
              lowest = numArray[i]; // Lowest equals whatever is in numArray at i spot
              } // End If
  
              if ( highest &gt; numArray[i]) // Keep setting highest to the highest value until it finds the highest one
              { // Start If
              highest = numArray[i]; // Highest equals whatever is in numArray at i spot
              } // End If
              total += numArray[i]; // Will continually add numArray at i spot until it has the total sales
          } // For Loop to find high and low values END
  
      // Main Contents of Function End Here //
  
  } // END creatReport Function
  // All Content for Functions Ends Here //
  </code></pre>
  
  <p>Well my problem is...I need to get my data across from one function to another. I thought I could figure out how to create Global Class Objects but I couldn't. So I thought I could get around just passing the arguments to another function and then restoring them in its own arrays and then keep doing that until i've completely copied all number arrays and string arrays. Well...yeah that does work EXCEPT this part in createReport():</p>
  
  <pre><code>// Variable Creation Begin //
  
      int const MAX = 5;  // Create array size variable
      int lowest; // The integer it will use to store the place of the lowest jar sales in the array
      int highest; // The integer it will use to store the place of the highest jar sales in the array
      int total; // The integer it will use to store total sales
      int numArray[MAX];  // Create array to store jar sales (integers)
      string typeArray[MAX];  // Create array to store types of salsa (strings)
  
  // Variable Creation End //
  </code></pre>
  
  <p>What happens is, I guess I am so tired that I missed it, every time I call that function it re-initializes those same variables again. I will put variables into another variable and then it will get re-initialized to default values.</p>
  
  <p>I tried using a counter variable that counted to one after it initialized and then after it was 1 it wouldnt initialize again. No that didn't work because the variables werent initialized outside the scope of the if statement. I then tried a GOTO statement that would skip the initialization after it happened once. Nope something went wrong with the first initialization phase and no compilation.</p>
  
  <p>I need to figure out how I can either </p>
  
  <ol>
  <li>keep those variables from getting re-assigned or initialized so they can maintain their values. Or </li>
  <li>figure out how to create global class objects (and yes I've tried the extern classes with multiple source files. No luck just lots of errors)</li>
  </ol>
  
  <p>I'm not very good at programming yet. But I assure you I've been working on this piece for hours and hours and hours and I stayed up all night just constantly trial and error. I really proud of myself because this code is pretty advanced for me. I've looked at every tutorial on Google and I'm fresh out of luck -- you guys are my last hope!! Sorry again guys. I know this is a dumb question...</p>
  
  <p>One last quick question. How do you create Global Class Objects? For example</p>
  
  <pre><code>MyClass
  {
    MyClass(){};
    ~MyClass(){};
  }
  
  MyClass MyClassObject;
  </code></pre>
  
  <p>How do I use MyClassObject throughout my entire program?</p>
  
  <p>The only way I can use it is if I create a new object every time with every function I use. And that means I lose all data stored inside my class?</p>
  
  <p>I've read that having global object isn't a good idea though. I would love to not have to use them but I have no clue on any alternatives that I can actually understand.</p>
  
  <p>Any other critiques or tips is GREATLY appreciated. I love this stuff I just don't have many people to ask questions to.</p>