每次调用 C++ 函数时,如何防止变量重新初始化?

Posted

技术标签:

【中文标题】每次调用 C++ 函数时,如何防止变量重新初始化?【英文标题】:How can I keep variables from being re-initialized every time I call a C++ function? 【发布时间】:2009-01-30 13:49:53 【问题描述】:

如何解决这个变量初始化问题?如果我只能弄清楚如何只初始化它们一次......

*   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,然后在它为 1 后它不会再次初始化。不,这不起作用,因为变量没有在 if 语句的范围之外初始化。然后我尝试了一个 GOTO 语句,它会在它发生一次后跳过初始化。不,第一个初始化阶段出了点问题,没有编译。

我需要弄清楚我该怎么做

    防止这些变量被重新分配或初始化,以便它们可以保持其值。或者 弄清楚如何创建全局类对象(是的,我已经尝试了带有多个源文件的 extern 类。没有运气,只是有很多错误)

我还不太擅长编程。但我向你保证,我已经为这件作品工作了好几个小时,而且我彻夜未眠,只是不断地试错。我真的为自己感到自豪,因为这段代码对我来说非常先进。我看过谷歌上的每一个教程,我很不走运——你们是我最后的希望!!再次对不起各位。我知道这是一个愚蠢的问题...

最后一个快速问题。你如何创建全局类对象?例如

MyClass

  MyClass();
  ~MyClass();


MyClass MyClassObject;

如何在整个程序中使用 MyClassObject?

我可以使用它的唯一方法是每次使用我使用的每个函数都创建一个新对象。这意味着我丢失了存储在班级中的所有数据?

我读过虽然拥有全局对象并不是一个好主意。我很想不必使用它们,但我不知道我能真正理解的任何替代方案。

非常感谢任何其他批评或提示。我喜欢这些东西,我只是没有很多人可以问问题。

【问题讨论】:

【参考方案1】:

你做得很好!简单的答案是在变量前面写静态:

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;

那种东西。有一些风格问题可以解决,但老实说,我说先让它发挥作用,然后我们可以讨论这些问题。

【讨论】:

也非常感谢!来自别人的那是非常令人欣慰的。我才 18 岁,所以我还有很长的路要走! 嘿,我记得我在你的舞台上!编程是如此有趣,继续前进,你会惊讶于它会把你带到哪里。也许有一天我们会在谷歌总部一起工作哈哈!【参考方案2】:

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

【讨论】:

以上是关于每次调用 C++ 函数时,如何防止变量重新初始化?的主要内容,如果未能解决你的问题,请参考以下文章

C++中如何在子类的构造函数中调用基类的构造函数来初始化基类成员变量

c语言如何对结构体某一成员初始化

防止每次我调用函数时声明空数组

如何在构造函数中初始化 C++ 对象成员变量?

防止静态初始化命令“惨败”,C++

我应该在我的函数中使用静态变量来防止重新计算值吗?