PDA

View Full Version : مشکل در کار با بردار (vector)



Pari_Programmer
دوشنبه 22 خرداد 1391, 10:27 صبح
با سلام

من دارم روی یه برنامه خیلی ساده کار میکنم اما نمیدونم چرا به یک مشکل عجیب برخورد کردم و هر چی هم سعی کردم نتونستم حلش کنم. در این برنامه من یک کلاس بسیار ساده دارم. فرض کنیم به صورت زیر:


class myclass {
public:
myclass();
myclass(const myclass& orig);
virtual ~myclass();

string Text;

};

(البته این رو بگم که کلاس اولیه ای که تعریف کرده بودم خیلی پیچیده تر از این بود ولی وقتی با مشکل روبرو شدم تصمیم گرفتم که اول مشکلم رو با یک کلاس ساده مثل این حل کنم بعد برم سراغ کلاس اصلی). بگذریم.
حالا میخوام در تابع main یک vector از این کلاس بسازم و ازش استفاده کنم.


vector<myclass> myvect;

myclass tmp;
tmp.Text="TEST";
myvect.push_back(tmp);
cout<<myvect.front().Text<<endl;

اما نکته عجیب اینجاست که در خروجی به جای رشته TEST، فقط یک سطر خالی چاپ میشه.
من برای بررسی صحت عملکرد کامپایلر و سایر موارد اومدم و یک vector از نوع رشته تعریف کردم و بعد اون رو مقداردهی کردم. در این مورد مشکلی وجود نداشت. مشکل وقتی پیش میاد که من یه vector از کلاس می سازم. کسی میدونه علت این مسپله چیه و چه جوری میشه حلش کرد؟
ممنون

راستی این رو هم بگم که اگر در تابع main در سطر ۶ به جای درخواست چاپ محتویات عنصر اول بردار، بخوایم سایز جدید بردار رو چاپ کنیم


cout<<myvect.size()<<endl;

همه چیز درست کار میکنه و با اضافه شدن هر عنصر به بردار، سایز بردار هم یک واحد افزایش پیدا میکنه. :اشتباه:

kia.celever
دوشنبه 22 خرداد 1391, 12:47 عصر
احتمالاً مشکل از Copy Constructor هست. بدنه تابع
myclass(const myclass& orig);
رو بزارید اینجا! :چشمک:

Pari_Programmer
دوشنبه 22 خرداد 1391, 13:00 عصر
مگر بدنه این سازنده باید حاوی چه مواردی باشه؟
راستش من هیچ دستوری برای این تابع ننوشتم.

kia.celever
دوشنبه 22 خرداد 1391, 13:13 عصر
توی قسمت
myvect.push_back(tmp);
کامپایلر در حقیقت tmp رو کپی میکنه توی وکتور. و برای این کار Copy Constructor رو صدا میزنه! وظیفه Copy Constructor همینه ...
حالا چون این سازنده شما خالیه، عملیات کپی ناقص انجام میشه! یعنی محتویات Text کپی نمیشه!
من کد شما رو به این صورت عوض کردم و کار کرد:
myclass(const myclass& orig)
{
Text = orig.Text;
}