2011-05-28 95 views
3

我正在做一个需要在C++中处理文件的任务。我被困在如何编写,然后回读动态创建的对象。 i-e通过指向派生类对象的基类指针的帮助。而且我们不知道在哪个特定时间存储了哪个对象。整个任务足够长,可以在这里发布,但我已经做了一个类似的简单代码来详细说明我的问题。动态对象和文件处理

    #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(); 
     } 
+0

P.S:我试图简单地写入文件并回读,然后在控制台窗口中打印。所以我知道我有我的新变量中的对象。 – user773974 2011-05-28 02:49:36

回答

3

如果您想要读取/写入任意对象,您要查找的术语是“对象序列化”。

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

+1

我刚刚要链接到parashift常见问题解答!我认为在描述序列化问题方面做得非常好,特别是对于这种情况。 – 2011-05-28 03:02:18