Как я могу предотвратить повторную инициализацию переменных каждый раз, когда я вызываю функцию C++?

StackOverflow https://stackoverflow.com/questions/495540

  •  20-08-2019
  •  | 
  •  

Вопрос

Как мне решить эту проблему с инициализацией переменной?Если бы я только мог придумать, как инициализировать их только один раз...

*   Main.cpp : main project file.


/**************************   Begin Header **************************/
#include "stdafx.h" //Required by Visual C ++
#include <string>   //Required to use strings
#include <iostream> //Required for a bunch of important things
#include <iomanip>  //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 & 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 & 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 & 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 & 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 << fixed << setprecision(1) << 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 << "Welcome to the /Professional Edition\\ of the Chip and Salsa Sale Tool EXPRESS." << endl;
    cout << "This handy-dandy tool will make a chip and salsa manufacturer's job much easier!" << endl;
    cout << endl << endl << endl;
    cout << "Press any key to begin inputing the number of jars sold for these salsa flavors: " << endl << endl;
    cout << "-Mild" << endl << "-Medium" << endl<< "-Sweet" << endl << "-Hot" << endl << "-Zesty" << endl << endl << endl;

    system("pause"); // Pause here. After this begin data input
    cout << endl << endl << 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 < 5 ; i++) // Start For Loop
    {
        cout << "Input how many Jars were sold for \"" << salsa.getType(i) << "\"" << ": "; // 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 << endl << 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 >> 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 < 0) { numTest = 0; cout << endl << endl << "You can't enter negative numbers! Try Again." << endl << endl << "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 < 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 < 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 > 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 //

Ну, моя проблема в том, что... мне нужно передать данные из одной функции в другую.Я думал, что смогу понять, как создавать объекты глобального класса, но не смог.Поэтому я подумал, что можно просто передать аргументы другой функции, а затем восстановить их в ее собственных массивах, а затем продолжать делать это до тех пор, пока полностью не скопирую все числовые массивы и массивы строк.Ну... да, это работает, ЗА ИСКЛЮЧЕНИЕМ этой части в createReport():

// 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 //

Что происходит, я думаю, я так устал, что пропустил это: каждый раз, когда я вызываю эту функцию, она снова инициализирует те же самые переменные.Я помещу переменные в другую переменную, а затем она будет повторно инициализирована значениями по умолчанию.

Я попытался использовать переменную-счетчик, которая после инициализации считалась до единицы, а затем, после того как она стала равна 1, больше не инициализировалась.Нет, это не сработало, потому что переменные не были инициализированы вне области действия оператора if.Затем я попробовал использовать оператор GOTO, который пропускал бы инициализацию после того, как она произошла один раз.Нет, что-то пошло не так на первом этапе инициализации и без компиляции.

Мне нужно выяснить, как я могу либо

  1. не допускайте переназначения или инициализации этих переменных, чтобы они могли сохранять свои значения.Или
  2. выясните, как создавать объекты глобального класса (и да, я пробовал внешние классы с несколькими исходными файлами.Не повезло, много ошибок)

Я пока не очень хорош в программировании.Но уверяю вас, я работал над этим произведением часами, часами и часами и не спал всю ночь, постоянно методом проб и ошибок.Я очень горжусь собой, потому что этот код для меня довольно продвинутый.Я просмотрел все уроки в Google, и мне совсем не повезло — вы, ребята, моя последняя надежда!!Еще раз извините, ребята.Я знаю, что это глупый вопрос...

Последний быстрый вопрос.Как вы создаете объекты глобального класса?Например

MyClass
{
  MyClass(){};
  ~MyClass(){};
}

MyClass MyClassObject;

Как использовать MyClassObject во всей программе?

Единственный способ его использовать — это создавать новый объект каждый раз с каждой используемой функцией.И это значит, что я потеряю все данные, хранящиеся внутри моего класса?

Я читал, что иметь глобальный объект — не очень хорошая идея.Мне бы очень хотелось не использовать их, но я понятия не имею о каких-либо альтернативах, которые я действительно могу понять.

Любая другая критика или советы ОЧЕНЬ ценятся.Мне это нравится, просто мне не так много людей, которым можно задать вопросы.

Это было полезно?

Решение

У тебя все хорошо!Простой ответ — написать static перед переменными:

static int const MAX = 5;  // Creat array size variable
static int lowest; // The integer it will use to store the place of the lowest jar sales in the array
static int highest; // The integer it will use to store the place of the highest jar sales in the array
static int total; // The integer it will use to store total sales
static int numArray[MAX];  // Create array to store jar sales (integers)
static string typeArray[MAX];      // Create array to store types of salsa (strings

Я думаю, что могу дать вам лучший совет: я посмотрю на ваш код еще немного.Что касается глобальных переменных, то то, что вы там написали с помощью MyClassObject, будет работать нормально.Вы бы использовали это так:

MyClass { 
public:
  MyClass(){}; 
  ~MyClass(){}; 
  int variable;
};
MyClass MyClassObject;

// in a method you'd do this
void whateverMethod() {
  MyClassObject.variable = 5;
  std::cout << MyClassObject.variable << std::endl;
}

Такие вещи.Есть некоторые проблемы со стилем, которые можно исправить, но, честно говоря, я говорю: сначала просто начните работать, а потом мы сможем об этом поговорить.

Другие советы

1) Сделайте их статичными, например

static string typeArray[MAX];

Инициализируйте их один раз, и они останутся неизменными, пока вы их не измените.Не пытайтесь использовать их одновременно из двух потоков.

2) Вы можете создать глобальный объект, объявив его в области файла:

class CFoo;

CFoo s_foo;

class CFoo 
{
    public:
    CFoo();
    ~CFoo();
}

Тогда s_foo будет экземпляром CFoo, доступным где угодно, где есть s_foo (этот файл и другие файлы, в которых есть extern CFoo s_foo;)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top