我的目标是使类 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/