我怀疑展示位置new
。我想在类Derived方法中调用Base Class构造函数。代码应该更清楚。
#include <iostream>
#include <string>
#include <type_traits>
#include <optional>
double calculate_z(int x) {
return 2 * x;
}
struct Base {
int x;
double z;
Base(): x(0), z(0) {}
Base(int value): x(value), z( calculate_z(x)) {}
};
class Derived: public Base {
public:
//is this enought to make it safe?
static_assert( std::is_trivially_copyable<Base>::value, "Object using new in placement constructor has to be trivial!");
std::optional<bool> force;
void load(int x)
{
new(this) Base(x); //can I call it safty? will this couse any trouble with force member?
// Do I need to call destructor manualy or delate? (probalby no)
force = std::make_optional(false);
}
};
int main()
{
Derived a;
a.load(5);
}
示例看起来更少。但是该类中的Base不是T
。衍生物是template
。我需要调用此构造函数,因为我从JSON读取数据。我使用的序列化库已经需要现有的对象。不从Base继承是一个问题(因为我可以使用Base作为成员)。那么为什么我需要调用构造函数?因为T来自其他库而不是调用构造函数使我的应用程序工作不正常。
所以问题:
我无法将Base作为成员,因为我使用http://uscilab.github.io/cereal/serialization_functions.html
对其进行序列化答案 0 :(得分:1)
你想在这里写什么?您列出的链接中没有任何地方 这样的建议。
看起来你想要的是:
struct Base {
int x;
double z;
Base(): x(0), z(0) {}
Base(int value): x(value), z( calculate_z(x) ) {}
};
class Derived : public Base {
std::optional<bool> force;
template<class Archive>
void serialize(Archive & archive)
{
archive( x, z, force );
}
};
class Safer {
Base b;
std::optional<bool> force;
template<class Archive>
void serialize(Archive & archive)
{
archive( b.x, b.z, force );
}
};
class Constructs {
Base b;
std::optional<bool> force;
template<class Archive>
void load(Archive & archive)
{
int x, z;
archive( x, z, force );
b = Base( x );
// Could be
// b = Base( x, z );
}
template<class Archive>
void save(Archive & archive)
{
archive( b.x, b.z/*???*/, force );
}
};