【问题标题】:Dynamic Objects and File handling动态对象和文件处理
【发布时间】:2011-05-28 02:48:03
【问题描述】:

我正在做一个需要在 C++ 中处理文件的作业。我被困在如何写然后读回动态创建的对象。即借助指向派生类对象的基类指针。而且我们不知道在任何特定时间哪个对象存储在那里。整个作业足够长,可以在这里发布,但我制作了一个类似的简单代码来阐述我的问题。

                    #include <string>
    #include <conio.h>
    #include <iostream>
    #include <vector>
    #include <fstream>

    using namespace std;

    class MAss
    {
    private:

    public:
        int age;
        string name;

        MAss();
        virtual void print();

         friend ofstream & operator << (ofstream & out, MAss & obj);
         friend ifstream & operator >> (ifstream & in, MAss & obj);
    };


    void MAss :: print()
    {
        cout<<endl<<"age = " << age;
        cout<<endl;
        cout<<"name = " <<name;
    }


    MAss :: MAss()
            :age(10)
            , name("Random")
        {}

    ofstream & operator <<  (ofstream & out, MAss & obj)
    {
        out<<obj.age;
        out<<" | " <<obj.name<<endl;
        return out;
    }


    ifstream & operator >> (ifstream & in, MAss & obj)
    {
        string temp;
        in>>obj.age;
        in>>temp;
        in>>obj.name;
        return in;
    }





    class Bass : public MAss
    {
    public:

        int reg;
        Bass();

        void print();

         friend ofstream & operator << (ofstream & out, Bass & obj);
        friend ifstream & operator >> (ifstream & in, Bass & obj);

    };

    Bass ::Bass()
        : reg(1)
    {}


    void Bass :: print()
    {
        MAss ::print();
        cout<<endl<<"REG = " <<reg;
    }

    ofstream& operator<<(ofstream& f, Bass& obj)
    {
        MAss & a = obj;

        f<<obj.reg<<" | ";

        f<<a;
        return f;
    }



    ifstream& operator>>(ifstream& f, Bass& obj)
    {
        string temp;
        MAss & a = obj;

        f>>obj.reg;
        f>> temp;
        f>>a;
        return f;
    }           




        void main ()
        {
            vector <MAss*> b(6);
            cout<<endl<<b.size();
            ofstream o("E:\\A.txt");

            for(int i=0; i<b.size();i++)
                b[i] = new Bass;

            b[0][0].age =1;
            b[0][0].name = "Jack";

            b[1][0].age =2;
            b[1][0].name = "Jill";


            b[2][0].age =3;
            b[2][0].name = "Jane";

            b[3][0].age =1;
            b[3][0].name = "Tom";


            b[4][0].age =2;
            b[4][0].name = "Phill";


            b[5][0].age =3;
            b[5][0].name = "Bone";


            for (int i=0; i<b.size(); i++)
            {
                o << b[i][0];
            }

            o.close();



            ifstream in("E:\\A.txt");
            vector <MAss*> arr;
            while(!in.eof())
            {
                Bass a;
                in >> a;

                a.print();
            }

            arr.pop_back();

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


            for (int i=0; i<arr.size(); i++)
            {
                cout<<endl<<endl<<endl<<endl<<"INDEX : " << i<<endl;
                arr[i][0].print();
            }



            getch();

            in.close();
        }

【问题讨论】:

  • PS:我试图简单地写入文件并读回,然后在控制台窗口中打印。这样我就知道我的新变量中有对象。

标签: c++ object dynamic file-io


【解决方案1】:

如果您想读/写任意对象,您正在寻找的术语是“对象序列化”。

C++ serialization 的答案对您有帮助吗?此外,还有一个关于该主题的 C++ FAQ entry 小节。

【讨论】:

  • 我正要链接到 parashift 常见问题解答!我认为它很好地描述了序列化问题,尤其是对于这种情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
  • 2017-11-24
  • 2016-02-04
  • 1970-01-01
  • 2019-11-09
  • 1970-01-01
  • 2010-09-20
相关资源
最近更新 更多