シリアライズのコーディング – プログラミング – Home

シリアライズのコーディング
 
通知
すべてクリア

シリアライズのコーディング


詩織
 詩織
(@詩織)
ゲスト
結合: 22年前
投稿: 1
Topic starter  

シリアライズの部分のコーディングをしています。
デバッガで確認する限り正常に動作しているように思えるのですが
このようなコーディング方法が正しいのかちょっと心配です。
長くなりますが、以下にコードを示します。

typedef CList<CSchItem, CSchItem&> CSchList;
typedef CMap<time_t, time_t, CSchList*, CSchList*> CSchMap;

class CSchItem : public CObject
{
//略
};

void CSchItem::SetDescription(const CString& str)
{ m_description = str; }
void CSchItem::SetStartTime(const CTime& startTime)
{ m_startTime = startTime; }
void CSchItem::SetEndTime(const CTime& endTime)
{ m_endTime = endTime; }
CString CSchItem::GetDescription(void) const
{ return m_description; }
CTime CSchItem::GetStartTime(void) const
{ return m_startTime; }
CTime CSchItem::GetEndTime(void) const
{ return m_endTime; }

class CSchDoc : public CDocument {
//略
protected:
CSchMap* m_schMap;
//略
};

CZSchDoc::CZSchDoc()
{
m_schMap = new CSchMap();
}

CZSchDoc::~CZSchDoc()
{
POSITION pos = m_schMap->GetStartPosition();
while (pos != NULL) {
time_t time;
CSchList* pSchList;
m_schMap->GetNextAssoc(pos, time, pSchList);
delete pSchList;
}
delete m_schMap;
}
void CZSchDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring()) {
m_schMap->Serialize(ar);
} else {
m_schMap->Serialize(ar);
}
}

template <> void AFXAPI SerializeElements(CArchive& ar, CSchList** ppSchList,
int nCount)
{
if (ar.IsStoring()) {
for (int i = 0; i < nCount; i++) {
(*ppSchList)->Serialize(ar);
nCount--;
}
} else {
for (int i = 0; i < nCount; i++) {
CSchList* pSchList = new CSchList();
pSchList->Serialize(ar);
*ppSchList = pSchList;
nCount--;
}
}
}

template <> void AFXAPI SerializeElements(CArchive& ar, CSchItem* pSchItem, int
nCount)
{
if (ar.IsStoring()) {
for (int i = 0; i < nCount; i++) {
ar << pSchItem->GetDescription();
ar << pSchItem->GetStartTime();
ar << pSchItem->GetEndTime();
nCount--;
}
} else {
for (int i = 0; i < nCount; i++) {
CString str;
ar >> str;
pSchItem->SetDescription(str);
CTime startTime;
ar >> startTime;
pSchItem->SetStartTime(startTime);
CTime endTime;
ar >> endTime;
pSchItem->SetEndTime(endTime);
nCount--;
}
}
}

シリアライズするデータ構造はCMapのVALUEにCListのポインタがセットされています。
まわりにVC++(MFC)使いがいないので、ここで質問させてもらった次第です。
開発環境は Win2000, VC++6.0SP5 MFC です。


引用解決済
トピックタグ
lap
 lap
(@lap)
ゲスト
結合: 22年前
投稿: 11
 

デバッグ依頼ならデバッガーを雇ってください。


返信引用
島
 島
(@島)
ゲスト
結合: 23年前
投稿: 238
 

デバッガーで追いかけて、動作確認なさって問題がないのでしたら、その試験の範囲では
正しさが証明できたと言えるでしょう

しかし、コードの書き方に関しては幾分嫌いなところがあります
>void CZSchDoc::Serialize(CArchive& ar)
>{
> if (ar.IsStoring()) {
> m_schMap->Serialize(ar);
> } else {
> m_schMap->Serialize(ar);
> }
>}

void CZSchDoc::Serialize(CArchive& ar)
{
m_schMap ->Serialize(ar);
}
では何故いけないのでしょうか?上のあなたのコードは無駄な判定が有ると思うし、
そもそも何故、CZSchDoc::m_schMap が SChMap * 型でなければならないのかも
よく分かりません
他に、CSchMap の VALUE が何故 CSchList * 型でなければならないのかもよく
判りません
最後に、SerializeElements() の中の for ループですが、ループの中で nCount--
しているので、全体として初期値の nCount 回ではなく、そのほぼ半分しか回らない
と思うのですが、読み違いでしょうか?


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました