كيف يمكنني الحفاظ على المتغيرات من إعادة تهيئة كل مرة أتصل C++ ؟
-
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 متعود تهيئة مرة أخرى.لا لم ينجح لأن المتغيرات رنت تهيئة خارج نطاق إذا كان البيان.ثم حاولت غوتو البيان أن تخطي التهيئة بعد ذلك حدث مرة واحدة.لا شيء ذهب على نحو خاطئ مع أول مرحلة التهيئة وليس تجميع.
أريد معرفة كيف يمكنني إما
- تبقى تلك المتغيرات من الحصول على إعادة تعيين أو تمت تهيئته حتى يتمكنوا من الحفاظ على القيم.أو
- معرفة كيفية إنشاء العالمية كائنات فئة (ونعم لقد حاولت extern فئات متعددة الملفات المصدر.لا حظ الكثير من الأخطاء)
أنا لست جيدة جدا في البرمجة حتى الآن.ولكن أود أن أؤكد لكم لقد تم العمل على هذه القطعة لساعات و ساعات و ساعات و سهرت طوال الليل فقط باستمرار التجربة والخطأ.أنا حقا فخور بنفسي لأن هذا الرمز هو متقدمة جدا بالنسبة لي.لقد بحثت في كل البرنامج التعليمي على جوجل و أنا حديث الحظ-أنتم آخر أمل!!آسف مرة أخرى يا رفاق.اعرف انه سؤال غبي...
واحد آخر سؤال سريع.كيف يمكنك إنشاء العالمية فئة الكائنات ؟ على سبيل المثال
MyClass
{
MyClass(){};
~MyClass(){};
}
MyClass MyClassObject;
كيف يمكنني استخدام MyClassObject طوال حياتي ؟
الطريقة الوحيدة التي يمكنني استخدامها إذا كنت إنشاء كائن جديد في كل مرة مع كل وظيفة يمكنني استخدام.و هذا يعني أنني تفقد جميع البيانات المخزنة داخل الصف ؟
لقد قرأت أن وجود كائن العالمية ليست فكرة جيدة على الرغم من.أحب أن لا يكون استخدامها ولكن ليس لدي أي فكرة عن أي البدائل التي يمكن أن فهم الواقع.
أي انتقادات او نصائح هو موضع تقدير كبير.أنا أحب هذه الأشياء أنا فقط لم يكن لديك الكثير من الناس إلى طرح الأسئلة.
المحلول
كنت بعمل جيد حقا!الجواب بسيط هو أن تكتب ثابتة أمام المتغيرات:
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;)