使用基类

时间:2018-01-17 11:14:17

标签: c++ new-operator c++17

我怀疑展示位置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);
}

Link do online compiler

原因

示例看起来更少。但是该类中的Base不是T。衍生物是template。我需要调用此构造函数,因为我从JSON读取数据。我使用的序列化库已经需要现有的对象。不从Base继承是一个问题(因为我可以使用Base作为成员)。那么为什么我需要调用构造函数?因为T来自其他库而不是调用构造函数使我的应用程序工作不正常。

所以问题:

  1. 我的程序安全吗?
  2. 如果1为是,是否有一个特征足以用模板替换Base?
  3. 如果不是,我怎么能安全?
  4. 作为会员的基地

    我无法将Base作为成员,因为我使用http://uscilab.github.io/cereal/serialization_functions.html

    对其进行序列化

1 个答案:

答案 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 );
    }
};