נושאים פעיליםנושאים פעילים  הצגת רשימה של חברי הפורוםרשימת משתמשים  חיפוש בפורוםחיפוש  עזרהעזרה
  הרשמההרשמה  התחברותהתחברות RSS עדכונים
תיכנות
RSS UnderWarrior Forums : RSS תיכנות
נושא

נושא: Static ? C++‎

שליחת תגובהשליחת נושא חדש
כותב
הודעה << נושא קודם | נושא הבא >>
אורח
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 02 August 2006 בשעה 18:25 | IP רשוּם
ציטוט אורח

לא הבנת את המשתנים הסטטיסטים ממש
אני הבנתי שזה של המחלקה ולא של כל אחד בנפרד אלה שלה מלא
אז איך אני יכול לעשות משתנה שיודפס ע"י המחלקה
ככה:
קוד:

private: static int count;
public: static int getCount() {return count; }

אז איך אני מאפס את  count ?
הרי זה private
אזי
קוד:

 int class_name::count=0;

לא יעבוד..
חזרה לתחילת העמוד הצג את כרטיס החבר של אורח חפש הודעות אחרות של אורח בקר בדף הבית של אורח
 
אלצ'קו
אחראי פורומים
אחראי פורומים
סמל אישי
ג2ר פ33תי

הצטרף / הצטרפה: 20 January 2006
משתמש: מנותק/ת
הודעות: 609
נשלח בתאריך: 02 August 2006 בשעה 21:03 | IP רשוּם
ציטוט אלצ'קו

  הכל אצלך הפוך. אם אתה יוצר משתנה סטטי (ולא משנה מה טווח ההכרה שלו) במתוך מחלקה, אתה חייב להצהיר עליו בנוסף מחוץ לה, בדיוק באופן שאמרת ש"לא יעבוד". לדוגמה:

קוד:
#include <iostream>

class cls
{
private:
    static int m_i;
public:
    int get_i(void){return m_i;}
    void set_i(int i){m_i=i;}
};

int cls::m_i=0;

int main(void)
{
    using namespace std;

    cls o;

    cout << o.get_i() << endl;

    return 0;
}


אם נסיר את השורה:
int cls::m_i=0;
כל העסק לא ילך. ב-VCPP6 נקבל את השגיאה הבאה בזמן הקישור:

קוד:
--------------------Configuration: tmp - Win32 Debug--------------------
Compiling...
main.cpp
Linking...
main.obj : error LNK2001: unresolved external symbol "private: static int cls::m_i" (?m_i@cls@@0HA)
Debug/tmp.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
Creating browse info file...

tmp.exe - 2 error(s), 0 warning(s)


אם המשתנה לא היה סטטי, לא היה צורך בהצהרה החיצונית.
חזרה לתחילת העמוד הצג את כרטיס החבר של אלצ'קו חפש הודעות אחרות של אלצ'קו
 
אורח
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 02 August 2006 בשעה 21:56 | IP רשוּם
ציטוט אורח

אוקי אז מה שעשיתי עובד.
ואני מעדיף להשתמש בפונקציה סטטית בשביל לקרוא לה דרך המחלקה עצמה ככה
cls::getCount()
מאשר לקרוא דרך משתנה למחלקה
חזרה לתחילת העמוד הצג את כרטיס החבר של אורח חפש הודעות אחרות של אורח בקר בדף הבית של אורח
 
אלצ'קו
אחראי פורומים
אחראי פורומים
סמל אישי
ג2ר פ33תי

הצטרף / הצטרפה: 20 January 2006
משתמש: מנותק/ת
הודעות: 609
נשלח בתאריך: 03 August 2006 בשעה 02:05 | IP רשוּם
ציטוט אלצ'קו

זכותך.
חזרה לתחילת העמוד הצג את כרטיס החבר של אלצ'קו חפש הודעות אחרות של אלצ'קו
 
Fate
פורומיסט על
פורומיסט על
סמל אישי

הצטרף / הצטרפה: 25 October 2005
משתמש: מנותק/ת
הודעות: 571
נשלח בתאריך: 03 August 2006 בשעה 10:30 | IP רשוּם
ציטוט Fate

פונקציה סטטית אבל לא יכולה לגשת למשתנים שהם לא סטטים באותה מחלקה...

חזרה לתחילת העמוד הצג את כרטיס החבר של Fate חפש הודעות אחרות של Fate
 
אלצ'קו
אחראי פורומים
אחראי פורומים
סמל אישי
ג2ר פ33תי

הצטרף / הצטרפה: 20 January 2006
משתמש: מנותק/ת
הודעות: 609
נשלח בתאריך: 03 August 2006 בשעה 21:12 | IP רשוּם
ציטוט אלצ'קו

Fate כתב:
פונקציה סטטית אבל לא יכולה לגשת למשתנים שהם לא סטטים באותה מחלקה...


מה גורם לך לחשוב כך?
חזרה לתחילת העמוד הצג את כרטיס החבר של אלצ'קו חפש הודעות אחרות של אלצ'קו
 
אורח
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 03 August 2006 בשעה 23:33 | IP רשוּם
ציטוט אורח

הוא צודק, היא לא יכולה לגשת למשתנה שלא סטטי במחלקה
כי היא נקראת דרך הCLASS עצמה ולא דרך משתנה מחלקה.
חזרה לתחילת העמוד הצג את כרטיס החבר של אורח חפש הודעות אחרות של אורח בקר בדף הבית של אורח
 
אורח
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 03 August 2006 בשעה 23:33 | IP רשוּם
ציטוט אורח

שוב אני ^
אבל זה לא הייעוד שלה לקרוא למשתנים לא סטטים
חזרה לתחילת העמוד הצג את כרטיס החבר של אורח חפש הודעות אחרות של אורח בקר בדף הבית של אורח
 
אלצ'קו
אחראי פורומים
אחראי פורומים
סמל אישי
ג2ר פ33תי

הצטרף / הצטרפה: 20 January 2006
משתמש: מנותק/ת
הודעות: 609
נשלח בתאריך: 03 August 2006 בשעה 23:38 | IP רשוּם
ציטוט אלצ'קו

אין לי מושג מה ניסית להגיד פה.
חזרה לתחילת העמוד הצג את כרטיס החבר של אלצ'קו חפש הודעות אחרות של אלצ'קו
 
Fate
פורומיסט על
פורומיסט על
סמל אישי

הצטרף / הצטרפה: 25 October 2005
משתמש: מנותק/ת
הודעות: 571
נשלח בתאריך: 04 August 2006 בשעה 16:32 | IP רשוּם
ציטוט Fate

משתנה סטטי, ופונקציה סטטית לא משויכים לInstance של Class כלשהו...
מזה נובע שני דברים:
א) לא צריך ליצור Class ולהקצות לו זיכרון כדי להשתמש בפונקציה סטטית או משתנה סטטי
ב) לפונקציה סטטית אין Instance משוייך, לכן היא יכולה לגשת רק למשתנים סטטים, או לקרוא לפונקציות סטטיות אחרות.

חזרה לתחילת העמוד הצג את כרטיס החבר של Fate חפש הודעות אחרות של Fate
 
אורח
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 05 August 2006 בשעה 16:52 | IP רשוּם
ציטוט אורח

וזה מה שנסיתי להגיד..

חזרה לתחילת העמוד הצג את כרטיס החבר של אורח חפש הודעות אחרות של אורח בקר בדף הבית של אורח
 
אלצ'קו
אחראי פורומים
אחראי פורומים
סמל אישי
ג2ר פ33תי

הצטרף / הצטרפה: 20 January 2006
משתמש: מנותק/ת
הודעות: 609
נשלח בתאריך: 13 August 2006 בשעה 01:54 | IP רשוּם
ציטוט אלצ'קו

בואו ננסה שוב: מה הבעיה? :(
חזרה לתחילת העמוד הצג את כרטיס החבר של אלצ'קו חפש הודעות אחרות של אלצ'קו
 
אלצ'קו
אחראי פורומים
אחראי פורומים
סמל אישי
ג2ר פ33תי

הצטרף / הצטרפה: 20 January 2006
משתמש: מנותק/ת
הודעות: 609
נשלח בתאריך: 13 August 2006 בשעה 11:07 | IP רשוּם
ציטוט אלצ'קו

ננסה שוב, והפעם ננסה ניסוח ברור יותר: מה הבעיה בקוד ו/או בהסבר שלי?
אלצ'קו כתב:
הכל אצלך הפוך. אם אתה יוצר משתנה סטטי (ולא משנה מה טווח ההכרה שלו) במתוך מחלקה, אתה חייב להצהיר עליו בנוסף מחוץ לה, בדיוק באופן שאמרת ש"לא יעבוד". לדוגמה:

קוד:
#include <iostream>

class cls
{
private:
    static int m_i;
public:
    int get_i(void){return m_i;}
    void set_i(int i){m_i=i;}
};

int cls::m_i=0;

int main(void)
{
    using namespace std;

    cls o;

    cout << o.get_i() << endl;

    return 0;
}


אם נסיר את השורה:
int cls::m_i=0;
כל העסק לא ילך. ב-VCPP6 נקבל את השגיאה הבאה בזמן הקישור:

קוד:
--------------------Configuration: tmp - Win32 Debug--------------------
Compiling...
main.cpp
Linking...
main.obj : error LNK2001: unresolved external symbol "private: static int cls::m_i" (?m_i@cls@@0HA)
Debug/tmp.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
Creating browse info file...

tmp.exe - 2 error(s), 0 warning(s)


אם המשתנה לא היה סטטי, לא היה צורך בהצהרה החיצונית.


הבעיה היא לא באיפוס, אלא בקישור. משתנה חבר מחלקה סטטי שאיננו קבוע חייב להיות מוצהר מחוץ למחלקה (כמו משתנה "גלובאלי").

אתה חושב שזה לא נכון? (רוצה הפניות?) אתה חושב ששהסבר המקורי שלי לא נכון? (יש לך אחד יותר טוב?) אתה חושב שהקוד שהבאתי לא פועל? (נסה לקמפל בעצמך) אתה חושב שהשגיאה שהבאתי לא תתרחש? (זה כבר מצחיק)

למשתנה סטטי ניגשים דרך שם המחלקה. זה כמובן נכון, אבל לא רלבנטי. השאלה הייתה: מה הבעייה עם התשובה שלי לאורח?
חזרה לתחילת העמוד הצג את כרטיס החבר של אלצ'קו חפש הודעות אחרות של אלצ'קו
 
SDX
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 14 August 2006 בשעה 12:28 | IP רשוּם
ציטוט SDX

לא נראה לי שהוא התכוון שיש לך בעיה בהסבר, הוא רק הוסיף שאי
אפשר לגשת למשתנים פרטיים דרך פונקציה סטטית,
לאורח שאמר שהוא מעדיף לקרוא למשתנה סטטי דרך פונקציה סטטית..
ואם צריך לעבוד עם משתנים פרטיים זה לא יעבוד.
חזרה לתחילת העמוד הצג את כרטיס החבר של SDX חפש הודעות אחרות של SDX בקר בדף הבית של SDX
 
אלצ'קו
אחראי פורומים
אחראי פורומים
סמל אישי
ג2ר פ33תי

הצטרף / הצטרפה: 20 January 2006
משתמש: מנותק/ת
הודעות: 609
נשלח בתאריך: 14 August 2006 בשעה 12:41 | IP רשוּם
ציטוט אלצ'קו

בטח שאפשר לגשת למשתנים פרטיים דרך פונקציה סטטית, כל עוד המשתנים הפרטיים הם סטטיים בפני עצמם.
חזרה לתחילת העמוד הצג את כרטיס החבר של אלצ'קו חפש הודעות אחרות של אלצ'קו
 

אם ברצונך להגיב לנושא זה עליך קודם להתחבר
אם אינך רשום/ה כבר עליך להרשם

  שליחת תגובהשליחת נושא חדש
גרסת הדפסה גרסת הדפסה

קפיצה לפורום
אינך יכול/ה לשלוח נושאים חדשים בפורום זה
אינך יכול/ה להגיב לנושאים בפורום זה
אינך יכול/ה למחוק את הודעותיך ותגוביך בפורום זה
אינך יכול/ה לערוך את הודעותיך ותגובותיך בפורום זה
אינך יכול/ה לצור סקרים בפורום זה
אינך יכול/ה להצביע בסקרים בפורום זה