gpt4 book ai didi

c++ - 将 Boost 序列化与前向声明类和继承一起使用

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:11:30 25 4
gpt4 key购买 nike

我正在使用 boost 序列化来存储和加载多个类。我的目标是对包含其他类的一个类使用序列化,这样其他类将被序列化。

但问题是这些类包含前向声明和继承,我无法使 boost 序列化与这些类一起工作。

我在编译时遇到问题,特别是在前向声明方面,有这些错误:

error: invalid use of incomplete type ‘class C’
error: forward declaration of ‘class C’
error: ‘value’ is not a member of ‘boost::is_polymorphic<C>’
...

有人能告诉我我的代码有什么问题吗?我错过了什么吗?我用于序列化派生类和前向声明类的代码是否正确?

A.h :

#include <boost/serialization/access.hpp>
#include <boost/serialization/vector.hpp>

class B;
class C;

class A {

private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive& ar, const unsigned int version) {
ar & m_Bvector;
}

protected:
vector<B*> m_Bvector;
vector<C*> m_Cvector;

/*....*/

}

注意: vector m_Bvector 可以包含 B* 或/和 C* 对象

B.h :

#include <boost/serialization/access.hpp>
#include "A.h"

class B {

private :
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive& ar, const unsigned int version) {
ar & m_someInt;
}

protected :
int m_someInt;

/*....*/

}

C.h :

#include <boost/serialization/base_object.hpp>
#include "B.h"

classe C : public B {

private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive& ar, const unsigned int version) {
ar & boost::serialization::base_object<B>(*this);
ar & m_someOtherInt;
}

protected:
int m_someOtherInt;

/*....*/

这是我调用保存和加载函数的方法:

SerializationManager.h :

#include <A.h>
#include <C.h>
#include <boost/serialization/export.h>

BOOST_CLASS_EXPORT(C);

class SerializationManager {

/*....*/

public:
bool save(string filename);
bool load(string filename);

protected:
A* m_classToSave;

}

SerializationManager.cpp :

#include "SerializationManager.h"
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <fstream>
#include <sstream>

bool SerializationManager::save(string filemname)
{

std::ofstream outputFile(filemname);
assert(outputFile.good());
boost::archive::text_oarchive oTextArchive(outputFile);

oTextArchive << m_classToSave;

return true;
}

bool SerializationManager::load(string filename)
{
delete m_classToSave;

std::ifstream ifs( filename );
assert(ifs.good());
boost::archive::text_iarchive ia(ifs);

// restore the schedule from the archive
ia >> m_classToSave;

return true;
}

/* ... */

最佳答案

Boost 需要知道类型是否是虚拟的(有任何虚拟方法,即通常用 vtable 实现)所以它可以依赖 typeiddynamic_cast 返回运行时-保真值。

您正试图在类型定义可用之前实例化序列化机制(仅前向声明时类型不完整),因此它无法生成序列化代码。

关于c++ - 将 Boost 序列化与前向声明类和继承一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40654265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com