c++使用构造函数作为成员函数(用于序列化)

标签 c++ serialization constructor

我的目标是使类 Particle 可序列化,问题是:

在派生类中读取istream时,是否可以使用Particle基类的构造函数作为成员函数进行“初始化”?

//可能造成误解的原因: 我知道我可以编写 setter,但是当代码块在 Particle 实例上应用访问运算符时将构造函数显示为可用成员函数时,我偶然发现了这个选项/想法。我从未听说过这种“延迟”初始化的方式,但我更喜欢它而不是编写大量的 setter...

基本上,这段代码是否正确?

using namespace std;

struct Serializable {
    virtual void write(ostream&) const = 0;
    virtual void read(istream&) = 0;
    virtual ~Serializable() {}
};

class Particle {
    double X, Y;
public:
    Particle(double x=0, double y=0) :X(x), Y(y) {}
    //...
};

class PParticle: Particle, Serializable {
    //void write...
    void read(istream& is) {
        double x, y;
        cout<<"coord x: "; is>>x;
        cout<<"coord y: "; is>>y;
        this->Particle(x, y); //this is the questionable line
    }
};

如果没有,或者如果我对序列化的想法完全错误,有人可以展示替代方案,我将非常感激!

最佳答案

您提到的行不会编译。如果您删除“this->”,它会编译,但随后它只会创建一个新的临时 Particle 对象,该对象将在函数结束时被销毁。因此它不会正确设置当前对象的 X、Y,它们也不会改变。

一个可能的解决方案是对变量 X、Y 使用“protected”(如果您不想为每个变量定义 setter)。这样 PParticle 类(以及 Particle 的所有其他派生类)将能够访问和修改它们。

关于c++使用构造函数作为成员函数(用于序列化),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43851315/

相关文章:

C++ Http 请求 SSL 错误

c# - 无法序列化 Web API 中的响应

ruby-on-rails - 使用 Rails 序列化将散列保存到数据库

c++ - 使用模板构造函数创建模板类对象

c++ - 为什么类的常量数据成员需要在构造函数中初始化?

c++ - 如何让 Visual Express 2010 找到我的 python.h 头文件?

c++ - 为 iOS 编译 OpenFST 时出现转换错误

java - 为什么 readObject 方法必须调用 defaultReadObject 以保持向后和向前兼容性

c++ - 使用基类静态常量变量构造基类,我可以这样做吗?

c++ - C++ placement new 如何工作?