使用 base class 调用 placement new
Calling placement new using base class
我对位置有疑问 new
。我想在 class 派生方法中调用 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);
}
原因
例子看起来点少。但是 class 不是 Base,而是 T
。导数是template
。我需要调用此构造函数,因为我从 JSON 读取数据。我使用的序列化库已经需要现有的那个对象。不从 Base 继承是一个问题(因为我可以使用 Base 作为成员)。那么为什么我需要调用构造函数呢?因为 T 来自其他库而不调用构造函数使我的应用程序无法正常工作。
所以问题:
- 我的程序安全吗?
- 如果 1 是,一个特征是否足以用模板替换 Base?
- 如果不是,我怎样才能保证安全?
基地成员
我无法将 Base 作为成员,因为我使用 http://uscilab.github.io/cereal/serialization_functions.html
对其进行了序列化
你想在这里写什么?在您列出的 link 中没有任何地方 像 这样的建议。
看来你想要的是:
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 );
}
};
我对位置有疑问 new
。我想在 class 派生方法中调用 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);
}
原因
例子看起来点少。但是 class 不是 Base,而是 T
。导数是template
。我需要调用此构造函数,因为我从 JSON 读取数据。我使用的序列化库已经需要现有的那个对象。不从 Base 继承是一个问题(因为我可以使用 Base 作为成员)。那么为什么我需要调用构造函数呢?因为 T 来自其他库而不调用构造函数使我的应用程序无法正常工作。
所以问题:
- 我的程序安全吗?
- 如果 1 是,一个特征是否足以用模板替换 Base?
- 如果不是,我怎样才能保证安全?
基地成员
我无法将 Base 作为成员,因为我使用 http://uscilab.github.io/cereal/serialization_functions.html
对其进行了序列化你想在这里写什么?在您列出的 link 中没有任何地方 像 这样的建议。
看来你想要的是:
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 );
}
};