error C2259: פולומרפיזם .C++. תקלה בהורשת מחלקה עם פונקציה ווירטואלית. - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

error C2259: פולומרפיזם .C++. תקלה בהורשת מחלקה עם פונקציה ווירטואלית.


mudale222

Recommended Posts

פולומורפיזם בC++. משחק לוח, הרעיון בכלליות הוא ליצור ווקטור של עצמים vector<Items ולרוץ עם מצביע לווקטור זה ולהדפיס לעדכן וכו'.

קוד התקלה:

>c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0(593): error C2259: 'Items' : cannot instantiate abstract class1>          due to following members:
1> 'void Items::draw_item(sf::RenderWindow &)' : is abstract
1> c:\users\mudale\desktop\newcs\win32\win32project1\win32project1\items.h(13) : see declaration of 'Items::draw_item'
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0(592) : while compiling class template member function 'void std::allocator<_Ty>::construct(_Ty *,const _Ty &)'
1> with
1> [
1> _Ty=Items
1> ]
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0(723) : see reference to function template instantiation 'void std::allocator<_Ty>::construct(_Ty *,const _Ty &)' being compiled
1> with
1> [
1> _Ty=Items
1> ]
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\type_traits(572) : see reference to class template instantiation 'std::allocator<_Ty>' being compiled
1> with
1> [
1> _Ty=Items
1> ]
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\vector(650) : see reference to class template instantiation 'std::is_empty<_Alloc>' being compiled
1> with
1> [
1> _Alloc=std::allocator<Items>
1> ]
1> c:\users\mudale\desktop\newcs\win32\win32project1\win32project1\map.h(44) : see reference to class template instantiation 'std::vector<Items,std::allocator<_Ty>>' being compiled
1> with
1> [
1> _Ty=Items
1> ]
1> Database.cpp
1>c:\users\mudale\desktop\newcs\win32\win32project1\win32project1\database.cpp(31): warning C4244: 'argument' : conversion from 'float' to 'int', possible loss of data
1>c:\users\mudale\desktop\newcs\win32\win32project1\win32project1\database.cpp(37): warning C4244: 'argument' : conversion from 'float' to 'int', possible loss of data
1>c:\users\mudale\desktop\newcs\win32\win32project1\win32project1\database.cpp(43): warning C4244: 'argument' : conversion from 'float' to 'int', possible loss of data
1>c:\users\mudale\desktop\newcs\win32\win32project1\win32project1\database.cpp(49): warning C4244: 'argument' : conversion from 'float' to 'int', possible loss of data
1>c:\users\mudale\desktop\newcs\win32\win32project1\win32project1\database.cpp(55): warning C4244: 'argument' : conversion from 'float' to 'int', possible loss of data
1>c:\users\mudale\desktop\newcs\win32\win32project1\win32project1\database.cpp(61): warning C4244: 'argument' : conversion from 'float' to 'int', possible loss of data
1>c:\users\mudale\desktop\newcs\win32\win32project1\win32project1\database.cpp(67): warning C4244: 'argument' : conversion from 'float' to 'int', possible loss of data
1>c:\users\mudale\desktop\newcs\win32\win32project1\win32project1\database.cpp(73): warning C4244: 'argument' : conversion from 'float' to 'int', possible loss of data
1>c:\users\mudale\desktop\newcs\win32\win32project1\win32project1\database.cpp(78): warning C4244: 'argument' : conversion from 'float' to 'int', possible loss of data
1>c:\users\mudale\desktop\newcs\win32\win32project1\win32project1\database.cpp(83): warning C4244: 'argument' : conversion from 'float' to 'int', possible loss of data
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0(593): error C2259: 'Items' : cannot instantiate abstract class
1> due to following members:
1> 'void Items::draw_item(sf::RenderWindow &)' : is abstract
1> c:\users\mudale\desktop\newcs\win32\win32project1\win32project1\items.h(13) : see declaration of 'Items::draw_item'
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0(592) : while compiling class template member function 'void std::allocator<_Ty>::construct(_Ty *,const _Ty &)'
1> with
1> [
1> _Ty=Items
1> ]
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0(723) : see reference to function template instantiation 'void std::allocator<_Ty>::construct(_Ty *,const _Ty &)' being compiled
1> with
1> [
1> _Ty=Items
1> ]
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\type_traits(572) : see reference to class template instantiation 'std::allocator<_Ty>' being compiled
1> with
1> [
1> _Ty=Items
1> ]
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\vector(650) : see reference to class template instantiation 'std::is_empty<_Alloc>' being compiled
1> with
1> [
1> _Alloc=std::allocator<Items>
1> ]
1> c:\users\mudale\desktop\newcs\win32\win32project1\win32project1\database.cpp(5) : see reference to class template instantiation 'std::vector<Items,std::allocator<_Ty>>' being compiled
1> with
1> [
1> _Ty=Items
1> ]
1> Generating Code...
1> Compiling...
1> Main.cpp

לא מצליח חהבין מה התקלה בדיוק. מנסה להוריש מחלקה שיש בה פונקציה ווירטואלית. (וכמובן בדקתי שכל היורשות ממנה "דורסות" וממשות מחדש פונקציה בשם זהה בדיוק).

המחלקות בנוית כמו בקובץ תמונה שלמטה.

המחלקה הראשית (עם הפונקציה הוורטואלית) והמחלקות שיורשות ממנה ישירות:

class Items {public:
Items(int leftupx, int leftupy);
int get_x();
int get_y();
bool set_x(double x);
bool set_y(double y);
bool set_x_y(double x, double y);
virtual void draw_item(sf::RenderWindow& window) = 0;
private:
int posx;
int posy;
};


class Fire :public Items {
public:
Fire(int leftupx, int leftupy);
void draw_item(sf::RenderWindow& window);
};


class Gate :public Items {
public:
Gate(int leftupx, int leftupy);
void draw_item(sf::RenderWindow& window);
};


class Wall :public Items {
public:
Wall(int leftupx, int leftupy);
void draw_item(sf::RenderWindow& window);
};


class Teleport :public Items {
public:
Teleport(int leftupx, int leftupy);
void draw_item(sf::RenderWindow& window);
};


class Throne :public Items {
public:
Throne(int leftupx, int leftupy);
void draw_item(sf::RenderWindow& window);
};


class Orc :public Items {
public:
Orc(int leftupx, int leftupy);
void draw_item(sf::RenderWindow& window);
};

מחלקת Figures והיורשות ממנה:

class Figures : public Items {public:
Figures(int leftupx, int leftupy) : Items(leftupx, leftupy){};
bool keepable_teleport();
bool keepable_fire();
void draw_item(sf::RenderWindow& window);
private:
bool check_fire;
bool check_teleport;
};




class King : public Figures{
public:
King(int leftupx, int leftupy);
void draw_item(sf::RenderWindow& window);
};


class Warrior : public Figures {
public:
Warrior(int leftupx, int leftupy);
void draw_item(sf::RenderWindow& window);
};


class Mage :public Figures {
public:
Mage(int leftupx, int leftupy);
void draw_item(sf::RenderWindow& window);
};


class Thief : public Figures {
public:
Thief(int leftupx, int leftupy);
void draw_item(sf::RenderWindow& window);
};

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

קישור לתוכן
שתף באתרים אחרים

Items.cpp:

#include "Items.h"

Items::Items(int leftupx, int leftupy) {
posx = leftupx;
posy = leftupy;
}


Fire::Fire(int leftupx, int leftupy) : Items(leftupx, leftupy) {}


Gate::Gate(int leftupx, int leftupy) : Items(leftupx, leftupy) {}


Wall::Wall(int leftupx, int leftupy) : Items(leftupx, leftupy) {}


Teleport::Teleport(int leftupx, int leftupy) : Items(leftupx, leftupy) {}


Throne::Throne(int leftupx, int leftupy) : Items(leftupx, leftupy) {}


Orc::Orc(int leftupx, int leftupy) : Items(leftupx, leftupy) {}


void Wall::draw_item(sf::RenderWindow& window) {

}




void Fire::draw_item(sf::RenderWindow& window) {


}


void Gate::draw_item(sf::RenderWindow& window) {
//Icon itself.
sf::Texture image;
image.loadFromFile("gate.png");
sf::Sprite sprite;
sprite.setTexture(image);
sprite.setPosition(Gate::get_x(),Gate::get_y());
window.draw(sprite);
}


void Throne::draw_item(sf::RenderWindow& window) {
//Icon itself.
sf::Texture image;
image.loadFromFile("throne.png");
sf::Sprite sprite;
sprite.setTexture(image);
sprite.setPosition(Throne::get_x(), Throne::get_y());
window.draw(sprite);
}


void Orc::draw_item(sf::RenderWindow& window) {
//Icon itself.
sf::Texture image;
image.loadFromFile("orc.png");
sf::Sprite sprite;
sprite.setTexture(image);
sprite.setPosition(Orc::get_x(), Orc::get_y());
window.draw(sprite);
}


void Teleport::draw_item(sf::RenderWindow& window) {

}


int Items::get_x() {
return(posx);
}


int Items::get_y() {
return(posy);
}


bool Items::set_x(double x) {
posx = x;
return(true);
}


bool Items::set_y(double y) {
posy = y;
return(true);
}


bool Items::set_x_y(double x, double y) {
posx = x;
posy = y;
return(true);
}


Figures.cpp:

#include "Figures.h"



bool Figures::keepable_teleport(){
return(check_teleport);
}


bool Figures::keepable_fire() {
return(check_fire);
}


void Figures::draw_item(sf::RenderWindow& window){}


//Figures::Figures(int leftupx, int leftupy) : Items(leftupx, leftupy) {}




King::King(int leftupx, int leftupy) : Figures(leftupx, leftupy) {}


Warrior::Warrior(int leftupx, int leftupy) : Figures(leftupx, leftupy) {}


Mage::Mage(int leftupx, int leftupy) : Figures(leftupx, leftupy) {}


Thief::Thief(int leftupx, int leftupy) : Figures(leftupx, leftupy) {}




void King::draw_item(sf::RenderWindow& window) {
//Icon itself.
sf::Texture image;
image.loadFromFile("king.png");
sf::Sprite sprite;
sprite.setTexture(image);
sprite.setPosition(King::get_x(), King::get_y());
window.draw(sprite);
}




void Thief::draw_item(sf::RenderWindow& window) {
//Icon itself.
sf::Texture image;
image.loadFromFile("thief.png");
sf::Sprite sprite;
sprite.setTexture(image);
sprite.setPosition(Thief::get_x(), Thief::get_y());
window.draw(sprite);
}


void Warrior::draw_item(sf::RenderWindow& window) {
//Icon itself.
sf::Texture image;
image.loadFromFile("warriror.png");
sf::Sprite sprite;
sprite.setTexture(image);
sprite.setPosition(Warrior::get_x(), Warrior::get_y());
window.draw(sprite);
}


void Mage::draw_item(sf::RenderWindow& window) {
//Icon itself.
sf::Texture image;
image.loadFromFile("mage.png");
sf::Sprite sprite;
sprite.setTexture(image);
sprite.setPosition(Mage::get_x(), Mage::get_y());
window.draw(sprite);
}

קישור לתוכן
שתף באתרים אחרים

יש עוד הרבה קוד אבל לא ממש קשור. הבעייה נובעת משם כי קוד עבד טוב לפני זה.

מה הכוונה בלאתחל משתנה מסוג Items? אין מצב שיש לי בקוד מקום שמנסה ליצור משתנה כזה בכלל. רק ווקטור של Items.

בכל מקרה עברתי על הקוד ואין כזה.

קישור לתוכן
שתף באתרים אחרים

עוד עדכון:

אם אני מוריד את ה0 מהפונקציה:

virtual void draw_item(sf::RenderWindow& window) = 0;

אני מקבל שגיאת linker שהוא לא מוצא את המימוש.

אם אני שם מימוש ריק, הכוונה:

    virtual void   draw_item(sf::RenderWindow& window) {};

אז העסק רץ.

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

void Map::print_map(sf::RenderWindow& window) {    Items *ptr2items;
for (unsigned int i = 0; i < level.size(); i++) {
ptr2items = &level[i];
ptr2items->draw_item(window);
}
}

ואז בעצם הוא מפעיל שום פעולת הדפסה.

vector<Items> level;

קישור לתוכן
שתף באתרים אחרים

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

האם פולימורפיזם עובד בלי מבציע ?

כשאתה מוסיף איבר לווקטור שהוא לא מטיפוס מצביע, מה באמת קורה ?

קישור לתוכן
שתף באתרים אחרים

שמע.

דבר ראשון אתה תותח. העסק עובד!!! אחרי איזה 6 שעות שאני נשבר על קומפילר הלוך ושוב.

הלכתי לפונקציה שקוראת מהקובץ עשיתי את כל ההקצאות דינמיות, שיניתי את כל המשתנים לItems* ואת כל ההתאמות הנדרשות.

ואכן העסק רץ :)

האמת שאני אשמח אם תרחיב טיפה למה העסק לא עובד בלי מצביעים.

תודה בכל מקרה.

עזרת לי מאוד.

קישור לתוכן
שתף באתרים אחרים

א. אני ממליץ לקרוא יותר טוב את יסודות השפה.

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

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

ד. יש קומפיילרים שהיו נותנים לך שגיאות יותר מובנות אולי.

קישור לתוכן
שתף באתרים אחרים

ארכיון

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

×
  • צור חדש...