نمایش نتایج 1 تا 3 از 3

نام تاپیک: برگشت متغیر های درون کلاس با استفاده از sizeof(student)

  1. #1

    Cool برگشت متغیر های درون کلاس با استفاده از sizeof(student)

    فرض کنین من یه کلاس به نام 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 تعریف شده اند رو برمی گردونه یا نه ؟

  2. #2
    کاربر دائمی آواتار Ananas
    تاریخ عضویت
    آبان 1390
    محل زندگی
    طول 50 و عرض 34 درجه
    سن
    36
    پست
    894

    نقل قول: برگشت متغیر های درون کلاس با استفاده از sizeof(student)

    عذر میخام ولی کلا کدتون ایرادای اساسی داره.
    فقط 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");

  3. #3

    نقل قول: برگشت متغیر های درون کلاس با استفاده از sizeof(student)

    نقل قول نوشته شده توسط 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");
    عالی بود تشکر

برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •