データの保存と読み込みにブースト シリアライゼーションを使用しています。私の目標は、オブジェクトを含むベクトルを格納することです。それらの型は派生クラスです。
リンカーは、別のクラスの obj ファイルで既に定義されているものがあることを教えてくれます (これは私のシリアル化とは関係ありません)。
誰かが私のコードの何が問題なのか教えてもらえますか? 何か不足していますか?
派生クラスをシリアル化するためのコードは正しいですか?
これは出力です:
エラー 1 エラー LNK2005: "public: static struct boost::archive::detail::extra_detail::guid_initializer const & const boost::archive::detail::extra_detail::init_guid::g" (?g@?$init_guid @VCYesNoElement@@@extra_detail@detail@archive@boost@@2ABU?$guid_initializer@VCYesNoElement@@@2345@B) ElementFactory.obj で既に定義されています
エラー 2 エラー LNK2005: "public: static struct boost::archive::detail::extra_detail::guid_initializer const & const boost::archive::detail::extra_detail::init_guid::g" (?g@?$init_guid @VCYesNoElement@@@extra_detail@detail@archive@boost@@2ABU?$guid_initializer@VCYesNoElement@@@2345@B) ElementFactory.obj で既に定義されています
エラー 3 エラー LNK2005: "public: static struct boost::archive::detail::extra_detail::guid_initializer const & const boost::archive::detail::extra_detail::init_guid::g" (?g@?$init_guid @VCYesNoElement@@@extra_detail@detail@archive@boost@@2ABU?$guid_initializer@VCYesNoElement@@@2345@B) ElementFactory.obj で既に定義されています
エラー 4 エラー LNK2005: "public: static struct boost::archive::detail::extra_detail::guid_initializer const & const boost::archive::detail::extra_detail::init_guid::g" (?g@?$init_guid @VCYesNoElement@@@extra_detail@detail@archive@boost@@2ABU?$guid_initializer@VCYesNoElement@@@2345@B) ElementFactory.obj で既に定義されています
エラー 5 エラー LNK2005: "public: static struct boost::archive::detail::extra_detail::guid_initializer const & const boost::archive::detail::extra_detail::init_guid::g" (?g@?$init_guid @VCYesNoElement@@@extra_detail@detail@archive@boost@@2ABU?$guid_initializer@VCYesNoElement@@@2345@B) ElementFactory.obj で既に定義されています
これは基本クラス(IElement) です。
#ifndef __ELEMENT_H__
#define __ELEMENT_H__
#include <string>
#include <vector>
#include <cassert>
#include <boost\serialization\base_object.hpp>
#include <boost\serialization\export.hpp>
#include <boost\archive\binary_iarchive.hpp>
#include <boost\archive\binary_oarchive.hpp>
typedef enum eElementType
{
eMultipleChoice,
eYesNo,
eKeyword,
eText,
eCloze
} eType;
class IElement
{
public:
virtual ~IElement();
void SetFrontText( const std::string& question );
std::string GetFrontText();
virtual eType GetType() = 0;
int GetStatus();
void StatusUp();
void StatusDown();
void Reset();
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & boost::serialization::make_nvp( "Status", m_status );
ar & boost::serialization::make_nvp( "FrontText", m_frontText );
}
protected:
bool VectorContainsString( std::vector<std::string>* _vec, const std::string& _str );
bool RemoveStringFromVector( std::vector<std::string>* _vec, const std::string& _str );
std::string m_frontText;
int m_status;
};
BOOST_SERIALIZATION_ASSUME_ABSTRACT( IElement )
#endif // __ELEMENT_H__
これは派生クラス(CYesNoElement) です。
#ifndef __YES_NO_ELEMENT_H__
#define __YES_NO_ELEMENT_H__
#include "Element.h"
class CYesNoElement : public IElement
{
public:
CYesNoElement();
virtual ~CYesNoElement();
bool GetSolution();
void SetSolution( bool solution );
bool check( bool given_answer );
// IElement
virtual eType GetType();
template<class Archive>
void serialize(Archive & ar, unsigned int file_version)
{
BOOST_SERIALIZATION_BASE_OBJECT_NVP( IElement );
ar & boost::serialization::make_nvp( "Solution", m_solution );
}
private:
bool m_solution;
};
BOOST_CLASS_EXPORT(CYesNoElement)
#endif // __YES_NO_ELEMENT_H__
これは、リンカー エラーが示唆しているクラスCElementFactoryです。
#ifndef __ELEMENTFACTORY_H__
#define __ELEMENTFACTORY_H__
#include "ClozeElement.h"
#include "KeywordElement.h"
#include "MultipleChoiceElement.h"
#include "TextElement.h"
#include "YesNoElement.h"
class CElementFactory
{
public:
CElementFactory(void);
virtual ~CElementFactory(void);
IElement* CreateElement( eType type );
private:
CClozeElement* CreateClozeElement();
CKeywordElement* CreateKeywordElement();
CMultipleChoiceElement* CreateMultipleChoiceElement();
CTextElement* CreateTextElement();
CYesNoElement* CreateYesNoElement();
};
#endif // __ELEMENTFACTORY_H__