עבור לתוכן

צריך עזרה בשיטה בונה מעתיקה

Featured Replies

פורסם

היי

יש לי מחלקה מסויימת ואני צריך להוסיף למחלקה שיטה בונה מעתיקה. משום מה מה שאני עושה הוא לא נכון...

[pre]public class Point

{

private int x ;

private int y ;

public Point(int x , int y){

this.x = x;

this.y = y;

}

public int getX(){

return this.x;

}

public int getY(){

return this.y;

}

public void setX(int x){

this.x = x;

}

public void setY(int y){

this.y = y;

}

public String toString(){

return ("<"+this.x+">" +","+ "<"+this.y+">");

}[/pre]

זאת המחלקה ואני מנסה להוסיף את השיטה בונה הזאת, אבל היא לא נכונה , מה הטעות ?!

[pre]

public Point (){

Point copyPoint = new Point (this.point);

return copyPoint;

}[/pre]

תודה לעוזרים ... ד"א הוא עושה לי קו אדום מתחת ל this.point

פורסם

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

בנאי מעתיק (או בשמו הלועזי Copy Constructor) הוא בנאי שמקבל כפרמטר אובייקט מאותו טיפוס. כלומר, אם יש לך קלאס בשם Point, אז הבנאי המעתיק צריך להיות פונקציה כזו:

public Point(Point other) {
// copy the members of "other" to "this"
}

יש?

חוץ מזה, למה שהוא יידע מה זה this.point? לא הגדרת ל-Point שום איבר שקוראים לו ככה.

פורסם

פעם הבאה פשוט תציין את השגיאה שהוא נותן לך.

בכל מקרה, לפחות אחת מהבעיות שלך היא העובדה ש-THIS הינו POINTER למחלקה עצמה, כלומר, חייבים לגשת אל המשתנים שלו בחץ

->

ולא נקודה

.

this->

תגיד אם יש לך עוד בעיות.

פורסם

זה נכון רק ב-++C. בג'אווה וב-#C משתמשים בנקודה, לא <-.

פורסם

נכון :] שכחתי שאין ממש פויינטרים למתכנתים הצעירים של ימינו :)

פורסם
  • מחבר

אוקיי.

תודה בינתיים

עריכה:

לא עובד לי פה משהו ...

[pre]public Point (Point point){

Point copyPoint = new Point (point);

return copyPoint;

}[/pre]

שיניתי לזה אבל יש לו בעיות עם ה return

פורסם

בנאי לא מחזיר ערך.

חוץ מזה, הביטוי הבא:

new Point(point);

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

תזכור שהבנאי הזה הוא בנאי לכל דבר. הוא צריך להתנהג כמו הבנאי הרגיל.

ושוב:

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

[/quote']

פורסם
  • מחבר

אוקיי, אז הבנאי הוא בעצם זה :

public Point (Point point){
Point copyPoint = new Point (point);

אז איך אני משתמש בהעתק של העצם שבניתי ?!

פורסם

שוב:

הביטוי הבא:

new Point(point);

אומר לקרוא לבנאי של Point שמקבל פרמטר מטיפוס Point. אבל זה אותה הפונקציה שאתה כרגע נמצא בתוכה' date=' מה שיגרום לרקורסיה אינסופית.

[/quote']

כמו שהבנאי הרגיל שלך שם ערכים ב-x וב-y, זה גם מה שהבנאי המעתיק צריך לעשות.

פורסם
  • מחבר

בתוכנית יש את הפקודות הבאות :


Point p1 = new Point (4,9);
Point p3 = new Point (p1);

עכשיו כשאני מריץ את התוכנית הוא רושם לי על הבנאי שיצרתי :

the local variable copyPoint is never read

איך אני כותה את זה לעזאזל ?!

פורסם
  • מחבר
public Point (Point point){
Point copyPoint = new Point (point);
}

פורסם

אז אני מבין שהחלטת לחלוטין להתעלם ממה שאמרתי לך קודם. אני חוזר ואומר:

כמו שהבנאי הרגיל שלך שם ערכים ב-x וב-y, זה גם מה שהבנאי המעתיק צריך לעשות.

פורסם
  • מחבר

ככה ?

[pre]	public Point (Point point){
this.x = point.x;
this.y = point.y;
}[/pre]

טוב אני חייב שתסביר לי בבקשה את העיניין כי כנראה שאני לא מבין אותו מההסבר של הספר ,

מה זה ?

[pre]public Date(Date date){
this.day = date.day;
this.month = date.month;
this.year = date.year;
}[/pre]

ומה זה ?

[pre]public Date getBirthday(){
Date copyBirthday = new Date(this.birthday);
return copyBirthday;
}[/pre]

תודה רבה על הכל

פורסם

כן, בדיוק ככה.

ולגבי ה-Date, שים לב להבדל בין שתי הפונקציות:

הראשונה היא בנאי - השם שלה הוא השם של המחלקה, ואין לה ערך החזרה בכלל (גם לא void). זו למעשה בדיוק דוגמה לבנאי מעתיק, כי היא מקבלת פרמטר אחד מהטיפוס שלה.

הפונקציה השנייה היא פונקציה רגילה לחלוטין - יש לה שם, והיא מחזירה אובייקט מטיפוס Date. הקוד עצמו משתמש בבנאי המעתיק בשביל להחזיר עותק של האובייקט הנוכחי (אם נעשה סתם return this זה זה לא יהיה טוב - האובייקט שיוחזר יהיה בדיוק האובייקט הנוכחי, ולא עותק שלו).

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים