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

נושא: בעיה עם מצביע לפונקציה - C++

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


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

למה זה לא עובד לי?
קוד:
#include "stdafx.h"

using namespace std;

class cls
{
public:
    void Print();
    void PrintSecond();
};

void cls::Print()
{
    cout << "PrintOne" << endl;
}

void cls::PrintSecond()
{
    cout << "PrintSecond" << endl;
}

int main(int argc, char* argv[])
{
    cls* func=new cls;
    void (cls::*pFunc) (void);
    pFunc=cls::Print;
    func->(*pFunc)();
    return 0;
}
חזרה לתחילת העמוד הצג את כרטיס החבר של אורח חפש הודעות אחרות של אורח בקר בדף הבית של אורח
 
אורח
אורח
אורח


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

קוד:
C:\Documents and Settings\Dan\ùåìçï äòáåãä\Test\Test.cpp(30) : error C2064: term does not evaluate to a function
Error executing cl.exe.

הנה הקוד שנותן את השגיאה
קוד:
#include "stdafx.h"

using namespace std;

class cls
{
public:
    void Print();
    void PrintSecond();
};

void cls::Print()
{
    cout << "PrintOne" << endl;
}

void cls::PrintSecond()
{
    cout << "PrintSecond" << endl;
}

int main(int argc, char* argv[])
{
    cls* func=new cls;
    void (cls::*pFunc) ();
    pFunc=cls::Print;
    func->*pFunc();
    return 0;
}

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

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

תשנה את השורה:
func->*pFunc();
לשורה:
(func->*pFunc)();
ותן שמות נורמליים יותר למשתנים (מצביע לאובייקט נקרא func?!), ותמשתמש ב-typedef-ים.
הסוגריים נחוצות בקריאה מאותה סיבה שהן נחוצות בהצהרה על המשתנה. סוגריים של קריאה לפונקציה "חזקות" יותר מכוכבית ומהחץ, ולכן אם אתה רוצה קודם שיתפרשו המצביעים ואחר כך תתבצע הקריאה, אתה צריך לשים על כל העסק סוגריים.



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


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

זה די שונה מה C++ שאני מכיר, למה זה? ומזאת הספרייה stdafx.h
זה די מוזר לי
חזרה לתחילת העמוד הצג את כרטיס החבר של אורח חפש הודעות אחרות של אורח בקר בדף הבית של אורח
 
אלצ'קו
אחראי פורומים
אחראי פורומים
סמל אישי
ג2ר פ33תי

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

אורח כתב:
זה די שונה מה C++ שאני מכיר, למה זה? ומזאת הספרייה stdafx.h
זה די מוזר לי


זה CPP סטנדרטי לחלוטין, כך שהשאלה שצריכה להישאל היא: איזה מין CPP אתה מכיר?

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


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

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

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

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

הצטרף / הצטרפה: 26 May 2006
מדינה: Israel
משתמש: מנותק/ת
הודעות: 103
נשלח בתאריך: 14 August 2006 בשעה 12:14 | IP רשוּם
ציטוט yiag

נראה לי הוא מתכוון למרכאות סביב stdafx.h

המרכאות הם בגלל שהקובץ stdafx.h מצורף לפרוייקט והמרכאות אומרות למהדר לחפש את זה בפרוייקט במקום בסיפרייה של ++VC 

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


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

התכוונתי סוגרים, לא מרכאות
וסביב זה:
func->*pFunc();
חזרה לתחילת העמוד הצג את כרטיס החבר של אורח חפש הודעות אחרות של אורח בקר בדף הבית של אורח
 
אלצ'קו
אחראי פורומים
אחראי פורומים
סמל אישי
ג2ר פ33תי

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

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

int *var[];
int (*var)[];

במקרה הראשון יש לנו מערך של מצביעים ל-int (כי לסוגריים מרובעות יש קדימות על הכוכבית), בעוד שבמקרה השני יש לנו את ‎*var שהוא בעצמו מערך של int-ים, כלומר var הוא מצביע למערך.

באופן דומה, לסוגריים מעוגלות של קריאה לפונקציה יש קדימות על הכוכבית, ולכן המשמעמות של:
func->*pFunc();
היא קריאה לפונקציה pFunc, ואז הפעלת אופרטור החץ על func עם מה שהפונקציה תחזיר (או משהו מוזר כזה).
אבל זה לא מה שאנחנו רוצים. אנחנו רוצים שתיקרא הפונקציה ש-pFunc מצביע אליה. pFunc איננו פונקציה בפני עצמה, אלא מצביע. לכן צריך קודם "לפרש" את המצביע, כלומר:

func->*pFunc
ורק אחר-כך, לקרוא לפונקציה שהביטוי הזה מתייחס אליה:

(func->*pFunc)();
ברור?
חזרה לתחילת העמוד הצג את כרטיס החבר של אלצ'קו חפש הודעות אחרות של אלצ'קו
 

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

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

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