פורסם 2010 באוקטובר 1915 שנים שלום לכולם. התחלתי ממש לא מזמן לתכנת בC++ ורציתי לנסות לבנות מערך "מוגן" בעזרת טמפלטים וכד'. הבעיה שלי היא שאני מקבל את השגיאות הנ"ל: Error 2 error LNK2019: unresolved external symbol "public: __thiscall PArray<int>::~PArray<int>(void)" (??1?$PArray@H@@QAE@XZ) referenced in function _main main.obj Error 3 error LNK2019: unresolved external symbol "public: __thiscall PArray<int>::PArray<int>(int)" (??0?$PArray@H@@QAE@H@Z) referenced in function _main main.obj אין לי מושג מאין הן נובעות, שכן ממימשתי את כל מה שהגדרתי: template <class T>class PArray{public: PArray<T> (int size); ~PArray<T> (); int GetSize(); T * operator[] (int index); PArray<T> operator+ (int n); PArray<T> operator- (int n); PArray<T> operator-- (); PArray<T> operator++ (); PArray<T> operator+= (int n); PArray<T> operator-= (int n);private: int size; int offset; T m_PArray [1];}; #include <stdio.h>#include "PArray.h" template <class T> PArray<T>::PArray( int size ) { m_PArray = new <T> [size]; this -> size = size; this -> offset = 0; } template <class T> PArray<T>::~PArray() { delete(m_PArray); }template <class T>int PArray<T>::GetSize(){ return this->size;}template <class T> T * PArray<T>::operator[] (int index) { int total_off = index + offset if((index >= 0) &&(index < this->size)) return this->m_PArray+index+offset; else throw -1; } template <class T>PArray<T> PArray<T>::operator+ (int n){ offset += n; return this;}template <class T> PArray<T> PArray<T>::operator- (int n) { offset -= n; return this; }template <class T> PArray<T> PArray<T>::operator-- () { return this-1; } template <class T> PArray<T> PArray<T>::operator++ () { return this+1; } template <class T> PArray<T> PArray<T>::operator+= (int n) { return this+n; } template <class T> PArray<T> PArray<T>::operator-= (int n) { return this-n; } בפונקציית main קיימת רק בנייה של האובייקט PArray<int> a(5) אם למישהו יש רעיון אשמח לעזרה. תודה
פורסם 2010 באוקטובר 1915 שנים נתחיל מזה שיש לך שגיאות חמורות בקוד של PArray. טיפ קטן - קודם כל תנסה לעשות את כל העסק בלי טמפלייטים בכלל (כלומר, נניח ש-PArray הוא תמיד מערך של int) ואז תוסיף את התמיכה בטמפלייטים.חוץ מזה, הפתרון לבעיה הספציפית שלך מוסבר כאן:http://www.parashift.com/c++-faq-lite/templates.html#faq-35.15
פורסם 2010 באוקטובר 1915 שנים מחבר אני לא יכול להגיד שהבנתי את הבעיה, אבל אני אעבוד באמת על המחלקה ללא טמפלייט קודם... אם אני לא אבין גם בסופו של עניין, אני אחזור תודה רבה
פורסם 2010 באוקטובר 1915 שנים בעקרון צריך להבין קצת יותר טוב איך עובדים טמפלייטים (מבחינת הקומפיילר) כדי להבין מה הבעיה. הלינק שהבאתי מסביר את זה לא רע.
פורסם 2010 באוקטובר 1915 שנים מחבר שאלה קטנה אחרת - שיניתי את הדוגמא כמו שאמרתי, למערך מוגן של int.עכשיו כשאני מגדיר טיפוס מסוג המערך(a לצורך העניין) ועושה ++a הואנכנס לפונקציה המתאימה, עושה את הפעולה הנכונה, אך לאחר שהוא מחזיר את הערך הוא פונה ל dctor.... למה זה?
פורסם 2010 באוקטובר 1915 שנים אתה מצפה שאני אדע איך מימשת? תעלה את הקוד הרלוונטי אחרי התיקון.הערה קטנה: ברוב המקרים לא צריך בכלל להשתמש ב-this. אפשר לגשת לאיברים של מחלקה פשוט ע"י שימוש בשם שלהם.עוד הערה: יש לך בלבול בין המשמעות של +operator ו =+operator (ועם שאר האופרטורים בהתאם), וטיפוסי ההחזרה שלהם לא נכונים.
פורסם 2010 באוקטובר 1915 שנים מחבר המימוש הוא אותו מימוש שקיים בקוד שהעלתי בהתחלה.אני אבדוק את עניין ערך ההחזרה.
פורסם 2010 באוקטובר 2015 שנים מהמעט שראיתי - אופרטור ++ prefix שלך מחזיר ערך. הוא אמור להחזיר רפרנס.בגלל שהוא מחזיר ערך זמני אז ה-DTOR נקרא.
פורסם 2010 באוקטובר 2115 שנים מחבר פתרתי את הבעיה, הדוגמא עובדת מעולה גם עם טמפלטים תודה לכל העוזרים, למרות שעדיין לא הבנתי סופית למה הקומפלייר לא מצליח לעשות לינק בין הקבצים(לא היה הסבר בנוגע לסיבה, אלא רק בנוגע לפתרון הבעיה בלינק) אם יש קישור להסבר או אם מישהו מרגיש נדיב ויסביר לי אני אשמח מאד תודה רבה על העזרה
פורסם 2010 באוקטובר 2115 שנים למעשה, שלושה סעיפים קודם יש הסבר מפורט:http://www.parashift.com/c++-faq-lite/templates.html#faq-35.12אני מקווה שהתייחסת להערות שלנו בנוגע לאופרטורים...
פורסם 2010 באוקטובר 2115 שנים מחבר תודה רבה.בהחלט התייחסתי. החלפתי את טיפוס ההחזרה לרפרנס אל האובייקט.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.