ورود

View Full Version : سوال: تبدیل ابجکت ها



H_G_G_I
سه شنبه 14 شهریور 1391, 16:29 عصر
سلام !:قلب:
من یه سوال داشتم .:چشمک:
همون طور که می دونید توی دات نت اگه مثلا یه کلاس داشته باشیم به اسم A و یه لیست از اون داشته باشیم !
می تونیم ابجکت هایی از نوع A و ابجکت ها یی که از A ارث بردن رو تو لیست اضافه کنیم !
بعد می شه با is فهمید که نوع اصلی چیه و با as هم می شه تبدیلش کرد .
مثل این کد ::

static void Main(string[] args)
{
List<Behavior> b = new List<Behavior>();
b.Add(new Behavior());
b.Add(new MyBehavior1());
b.Add(new MyBehavior2());
if (b[1] is MyBehavior1)
{
MyBehavior1 mb1 = b[1] as MyBehavior1;
mb1.Speed = 8;
}
}
public class Behavior
{
public bool Enable;
public int State;

virtual void Update() { }
}
public class MyBehavior1 : Behavior
{
public int Speed;
}
public class MyBehavior2 : Behavior
{
public int Helth;
}

-
حالا من دقیقا می خوام چنین چیزی رو تو سی پلاس داشته باشم .
خودم این کارو کردم ::
-

int _tmain(int argc, _TCHAR* argv[])
{
system("PAUSE");

std::vector<Behavior*> b;
b.push_back(new Behavior);
b.push_back(new MyBehavior1);
b.push_back(new MyBehavior2);

//????????????????????
//????????????????????
//????????????????????

system("PAUSE");
return 0;
}

-
برای تبدیل از static_cast استفاده می کنم می شه ولی اگر نوع شی اون چیزی که می خوایم نباشه همه چی بهم می خوره ! من می خوام مثل is عمل کنه که اگه تبدیل نمیشه NULL بده !
فکر کنم با dynamic_cast چنین چیزی بشه اما وقتی ازش استفاده می کنم اینو می گه !
Behavior Is Not polymorphic Type
-
-
چه کنم ؟

rezaricky
سه شنبه 14 شهریور 1391, 19:43 عصر
سلام ،از dynamic_cast استفاده کن :
#include <iostream>
#include <vector>

class Base
{
public: virtual ~Base() {}
};

class D1: public Base {};

class D2: public Base {};

int main(int argc,char* argv[])
{


std::vector<Base*> b;
b.push_back(new D1);
b.push_back(new D2);

if (dynamic_cast<D1*>(b[1])==NULL)
{
std::cout << "not a D1" ;
}
if (dynamic_cast<D2*>(b[1])==NULL)
{
std::cout << "not a D2" ;
}


}

H_G_G_I
سه شنبه 14 شهریور 1391, 20:08 عصر
ممنون . اول همین کارو کردم نگو متد Virtual نذاشته بودم نمی شد ! مر30
:بوس:
:قلب: