כותב |
|
אורח אורח
הצטרף / הצטרפה: 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 רשוּם
|
|
|
|
נראה לי הוא מתכוון למרכאות סביב stdafx.h
המרכאות הם בגלל שהקובץ stdafx.h מצורף לפרוייקט והמרכאות אומרות למהדר לחפש את זה בפרוייקט במקום בסיפרייה של ++VC
|
חזרה לתחילת העמוד |
|
|
אורח אורח
הצטרף / הצטרפה: 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
ורק אחר-כך, לקרוא לפונקציה שהביטוי הזה מתייחס אליה:
|
חזרה לתחילת העמוד |
|
|