PDA

View Full Version : سوال: مشکل با چاپ متغیر در یک کلاس



persiansh
جمعه 28 مرداد 1390, 20:21 عصر
سلام اشکال این برنامه کجاست؟چرا 8 چاپ نمیکنه؟
#include <iostream>

using namespace std;

class myclass
{
void* member[100];
public:
void setmember(int ,void* );
void* getmember(int );
};

void myclass::setmember(int x,void* value)
{
member[x]=value;
}

void* myclass::getmember(int x)
{
return member[x];
}
int main()
{
myclass myints;
int b=8;
myints.setmember(3,&b);
cout<<myints.getmember(3)<<'\n';
return 0;
}

_hamid
جمعه 28 مرداد 1390, 22:08 عصر
#include <iostream>

using namespace std;

class myclass
{
int member[100];
public:
void setmember(int ,int* );
int getmember(int );
};

void myclass::setmember(int x,int* value)
{
member[x]=*value;
}

int myclass::getmember(int x)
{
return member[x];
}
int main()
{
myclass myints;
int b=8;
myints.setmember(3,&b);
cout<<myints.getmember(3)<<'\n';
return 0;
}

persiansh
جمعه 28 مرداد 1390, 22:38 عصر
:اشتباه:نه .....باید همون void باشه چون باید هر نوع دیگه ای رو بگیره مثل long

Salar Ashgi
جمعه 28 مرداد 1390, 23:10 عصر
خوب چرا از Template ها استفاده نمی کنید ؟!

persiansh
جمعه 28 مرداد 1390, 23:21 عصر
#include <iostream>

using namespace std;

template <class T, int N>

class myclass
{
T member [N];
public:
void setmember (int x, T value);
T getmember (int x);
};

template <class T, int N>
void myclass<T,N>::setmember (int x, T value)
{
member[x]=value;
}
template <class T, int N>
T myclass<T,N>::getmember (int x)
{
return member[x];
}
int main ()
{
myclass <int,7> myints;
myclass <double,5> myfloats;
myints.setmember (0,100);
myints.setmember(1,59);
myints.setmember(6,25);
myfloats.setmember (2,1.23456);
myfloats.setmember (3,3.1416);
cout << myints.getmember(0) << '\n';
cout << myints.getmember(1) << '\n';
cout << myints.getmember(6) << '\n';
cout << myfloats.getmember(3) << '\n';
cout << myfloats.getmember(2) << '\n';
return 0;
}

من اینو نوشتم ولی باید اینطوری باشه..مثلا اسم کلاس pباشه و کلاس p شامل لیستی از اشیاء مختلف باشه نه اینکه چند نمونه از کلاس p بسازی مثلا p.getmember(0) یک int باشه و p.getmember(1) یک float

persiansh
جمعه 28 مرداد 1390, 23:29 عصر
باید اینطوری باشه..مثلا اسم کلاس pباشه و کلاس p شامل لیستی از اشیاء مختلف باشه نه اینکه چند نمونه از کلاس p بسازی مثلا p.getmember(0) یک int باشه و p.getmember(1) یک float

persiansh
شنبه 29 مرداد 1390, 00:13 صبح
با template هم همین اشکال بالا رو دارم اینم کدش بازم جوابش آدرس هست....

http://forum.vru.ac.ir/jscripts/tiny_mce/plugins/emotions/img/smiley-cry.gif





using namespace std;

template<class T,int I>
class myclass
{
T member[I];
public:
void setmember(int ,T);
T getmember(int );
};
template<class T,int I>
void myclass<T,I>::setmember(int x,T value)
{
member[x]=value;
}
template <class T,int I>
T myclass<T,I>::getmember(int x)
{
return member[x];
}
int main()
{
myclass<void*,5> myType;
int b=6;
myType.setmember(3,&b);
cout<<myType.getmember(3)<<'\n';
return 0;
}
#include <iostream>

_hamid
شنبه 29 مرداد 1390, 04:46 صبح
این حرکت رو من نمی فهمم؟!
myclass<void*,5> myType;
چه اصراریه از اشاره گر به void استفاده کنی وقتی داری از قالب ها استفاده می کنی؟
همونجور که خودت اون بالا نوشتی درست بود!
myclass <int,7> myints; myclass <double,5> myfloats;
ببین اشاره گر به void واسه اون قدیما بود که قالب ها نبودند. یا اینکه تو بخوای الان با سی کد بزنی قالب ها رو نداری.
حالا هم اگر بخوای باز می شه ولی خوب باید یادت باشه واسه اینکه از این نوع داده استفاده کنی باید داده allocate کنی.
بعد هر وقت خواستی ازشون استفاده کنی cast کنی به داده‌ای که می خوای که احتمال ترکیدگی زیاد میشه! یعنی type-safe نیست.

_hamid
شنبه 29 مرداد 1390, 13:02 عصر
من الان دوهزاریم افتاد بعد از خوندن دوباره‌ي سوال :دی
ببین اینی که میگی رو خودت می تونی با void* بنویسی ولی همینطور که گفتم سخته و احتمالا ترکیدگی هست!
معادل اینی که می خوای میشه boost::any. یه container که می تونی همه چیز توش نگه داری کنه.
این رو بخون به دردت می خوره:
http://www.kuro5hin.org/story/2002/5/1/142321/9513