# Native Code > برنامه نویسی با C > برنامه نویسی با Borland C++‎ Builder > سوال: برگشت متغیر های درون کلاس با استفاده از sizeof(student)

## sourcecode

فرض کنین من یه کلاس به نام student تعریف کردم که 4 تابع public به صورت زیر تعریف کردم 

public:
  int std_number(int number)
  {
    return number;
  }
  string std_name(string name)
  {
    return name;
  }
  string std_family(string fam)
  {
    return fam;
  }
  float std_ave(float ave)
  {
    return ave;
  }

توی main یه شی به نام std ازش میسازم ( student std )
حالا به توابع عمومی مقدار میدم  مثلا { number = 1 - name = ahmad - fam = kho - ave = 15.55 }
حالا با دستور زیر مقادیر رو درون یک فایل میریزیم ولی وقتی ورودی بالا رو با تابع write درون فایل میریزم  متن ( Ì ) رو مینویسه ؟
ofstream fwrite;
fwrite.write((char *)&std, sizeof(student));
سوالم اینه که وقتی میگیم sizeof(student) منظورش اینه که اندازه متغیر های private رو بده؟  ( چون به جای اینکه در public مقادیر رو وارد کنیم بیایم ابتدا در private چهار متغیر به نام int number , string name , string fam , float ave رو تعریف کنیم و در قسمت public بهشون مقدار بدیم وقتی دستور 
fwrite.write((char *)&std, sizeof(student));
رو استفاده میکنیم مقادیری که وارد کردیم { number = 1 - name = ahmad - fam = kho - ave = 15.55 } رو بدرستی درون فایل میریزه ولی در صورتی که اگه private وجود نداشت و فقط در public به تابع مقدار میدادیم متن ( Ì ) رو درون فایل متنی می ریخت ! ! ! )
در کل سوالم اینه که sizeof(student) فقط اندازه بخش private رو برمیگردونه و به تابع write میده در صورتی که اگه از struct استفاده میکردیم که به صورت پیش فرض public هست و مشکلی بوجود نمیاد و مقادیر ورودی رو بدرستی درون فایل میریخت ؟

*آیا sizeof(student) فقط اندازه متغیر های درون کلاس student که به صورت private تعریف شده اند رو برمی گردونه یا نه ؟*

----------


## Ananas

عذر میخام ولی کلا کدتون ایرادای اساسی داره.
فقط sizeof نیست مشکلش.
توابعی که داخل کلاس تعریف کردید هدفشون چیه؟ فقط یک مقدار رو میگیرن و عینا همونو برمیگردونن! خب چرا؟! شاید میخاید مقداردهی کنید متغیرهای قسمت private رو ولی اینطوری راهش نیست. باید از عملگر = استفاده کنید.
در مورد sizeof هم باید دقت کنید که سایز هر کلاس بسته به سایز متغیر های تعریف شده داخل کلاس داره و private یا public اش فرقی نداره. ولی توابع به سایز شی هیچ کاری ندارن. هزار تا تابع هم تعریف کنید داخل کلاس سایزش فقط بسته به متغیرهای داخل کلاس هست. متغیرهای داخل توابع هم ربطی به سایز کلاس ندارن...اونا در زمان اجرای تابع ساخته میشن و با پایان تابع عمرشون تموم میشه. پس فقط متغیرهایی که تو بدنه ی تابع تعریف کردید سایزو مشخص میکنن. و البته کلاس string هم سایزش مثل کلاس های دیگه ثابت هست و رشته ی داخلش به صورت داینامیک حافظه میگیره.
در مورد نوشتن تو فایل هم این روش درست عمل نمیکنه... اگر میخاید اطلاعات کلاس رو به حالت رشته ذخیره کنید باید تک تک فیلد هاش رو تبدیل به رشته کنید و بنویسید.
در کل من یک نمونه مینویسم شاید منظورتون این بوده:

#include <sstream>
#include <fstream>      // std::ofstream
class TStudent
{
private:
    int            __number;
    std::string    __name;
    std::string    __fam;
    float          __age;
public:
    void Set_Number(const int number)
    {
        this->__number = number;
    };
    int Get_Number()
    {
        return this->__number;
    };


    void Set_Name(const std::string name)
    {
        this->__name = name;
    };
    std::string Get_Name()
    {
        return this->__name;
    };


    void Set_Fam(const std::string fam)
    {
        this->__fam = fam;
    };
    std::string Get_Fam()
    {
        return this->__fam;
    };


    void Set_Age(const int age)
    {
        this->__age = age;
    };
    float Get_Age()
    {
        return this->__age;
    };


    std::string DataToString()
    {
        std::string ret_str;


        char str[64];
        std::itoa(this->__number, str, 10);
        ret_str = str;
        ret_str += "\n";


        ret_str += this->__name;
        ret_str += "\n";
        ret_str += this->__fam;
        ret_str += "\n";


        std::ostringstream oss;
        oss << this->__age;
        ret_str += oss.str();
        return ret_str;
    };


    void WriteDataToFile(std::string file_name)
    {
        std::ofstream ofs (file_name.c_str(), std::ofstream::out);
        ofs << this->DataToString();
        ofs.close();
    };
};

مثال:

    TStudent s;
    s.Set_Age(29.0f);
    s.Set_Number(20);
    s.Set_Name("mohammad");
    s.Set_Fam("qadiany");
    s.WriteDataToFile("D:\\test_student.txt");

----------


## memary14

> عذر میخام ولی کلا کدتون ایرادای اساسی داره.
> فقط sizeof نیست مشکلش.
> توابعی که داخل کلاس تعریف کردید هدفشون چیه؟ فقط یک مقدار رو میگیرن و عینا همونو برمیگردونن! خب چرا؟! شاید میخاید مقداردهی کنید متغیرهای قسمت private رو ولی اینطوری راهش نیست. باید از عملگر = استفاده کنید.
> در مورد sizeof هم باید دقت کنید که سایز هر کلاس بسته به سایز متغیر های تعریف شده داخل کلاس داره و private یا public اش فرقی نداره. ولی توابع به سایز شی هیچ کاری ندارن. هزار تا تابع هم تعریف کنید داخل کلاس سایزش فقط بسته به متغیرهای داخل کلاس هست. متغیرهای داخل توابع هم ربطی به سایز کلاس ندارن...اونا در زمان اجرای تابع ساخته میشن و با پایان تابع عمرشون تموم میشه. رساله های معماری پس فقط متغیرهایی که تو بدنه ی تابع تعریف کردید سایزو مشخص میکنن. و البته کلاس string هم سایزش مثل کلاس های دیگه ثابت هست و رشته ی داخلش به صورت داینامیک حافظه میگیره.
> در مورد نوشتن تو فایل هم این روش درست عمل نمیکنه... اگر میخاید اطلاعات کلاس رو به حالت رشته ذخیره کنید باید تک تک فیلد هاش رو تبدیل به رشته کنید و بنویسید.
> در کل من یک نمونه مینویسم شاید منظورتون این بوده:
> 
> #include <sstream>
> #include <fstream>      // std::ofstream
> ...


عالی بود تشکر

----------

