c ++将未知类型传递给函数和任何类类型定义

Bac*_*ach 1 c++ ofstream

我正在尝试创建一个通用类来编写和从文件中读取对象.称之为ActiveRecord类

只有一个方法,它保存类本身:

void ActiveRecord::saveRecord(){
 string fileName = "data.dat";

 ofstream stream(fileName.c_str(), ios::out);
 if (!stream) {
  cerr << "Error opening file: " << fileName << endl;
  exit(1);
 }
 stream.write(reinterpret_cast<const char *> (this), sizeof(ActiveRecord));
 stream.close();
}
Run Code Online (Sandbox Code Playgroud)

现在我用User类扩展这个类:

class User : public ActiveRecord
{
 public:
  User(void);
  ~User(void);
  string name;
  string lastName;
};
Run Code Online (Sandbox Code Playgroud)

创建和保存用户我想做的事情如下:

User user = User();
user.name = "John";
user.lastName = "Smith"
user.save();
Run Code Online (Sandbox Code Playgroud)

如何让这个ActiveRecord :: saveRecord()方法获取任何对象和类定义,以便它写出我发送的任何内容:

看起来像:

void ActiveRecord::saveRecord(foo_instance, FooClass){
 string fileName = "data.dat";

 ofstream stream(fileName.c_str(), ios::out);
 if (!stream) {
  cerr << "Error opening file: " << fileName << endl;
  exit(1);
 }
 stream.write(reinterpret_cast<const char *> (foo_instance), sizeof(FooClass));
 stream.close();
}
Run Code Online (Sandbox Code Playgroud)

当我们在它的时候,c ++中的默认对象类型是什么.例如.在objective-c中它是java中的id它是AS3中的Object它是Object在C++中是什么?

Ste*_*hen 5

stream.write(reinterpret_cast<const char *> (foo_instance), sizeof(FooClass));
Run Code Online (Sandbox Code Playgroud)

这不起作用. string在堆上分配数据(IIRC,当它大于16chars时).您的重新解释强制转换将不包括该堆数据.

不要重新发明轮子,这是一个非常重要但解决的问题.使用Google Protocol Buffers,XML或boost序列化库.

您的想法是模板,但您不能"只是序列化任何对象",因为在POD(普通旧数据)类型之外,它们的表示并不明显.

此外,sizeof(BaseClass)与User子类一起使用将不起作用.它会将子类的成员数据从转换中切除,而不是将其放入文件中.

并且没有"c ++中的默认对象类型".