相互参照のクラスをC++でどう定義するのか少々悩みました。
このままだとすぐ忘れそうなので簡単な例を使ったメモを書いておきます。
いまいち細かい部分をよくわかってません。
■クラス図
※ NameA、NameBは名前空間です。

ObjectAはObjectBを持っています。
ObjectBはcreateObjectA()が呼ばれた時点でObjectAを作成し、保持します。
ObjectBがObjectAのオブジェクトそのものを持つと、ObjectAの中のObjectBの中のObjcetAの中のObjectBの中のObjectA、、、(以下、無限に続く)ができるのでポインタでしか持てません。
ObjectAとObjectBはお互いを参照します。
■コード
ObjectA.h
#ifndef __OBJECT_A_H__
#define __OBJECT_A_H__
#include "ObjectB.h"
namespace NameA
{
class ObjectA
{
public:
ObjectA();
virtual ~ObjectA();
NameB::ObjectB* getObjectB();
private:
NameB::ObjectB m_objectB;
};
}
#endif
ObjectA.cpp
#include "ObjectA.h"
using namespace NameA;
ObjectA::ObjectA()
{
}
ObjectA::~ObjectA()
{
}
NameB::ObjectB* ObjectA::getObjectB()
{
return &m_objectB;
}
ObjectB.h
#ifndef __OBJECT_B_H__
#define __OBJECT_B_H__
// NameA::ObjectAの先行宣言
// ここを#include "ObjectA.h"に代えるとエラーになる。
namespace NameA
{
class ObjectA;
}
namespace NameB
{
class ObjectB
{
public:
ObjectB();
virtual ~ObjectB();
NameA::ObjectA* createObjectA();
private:
NameA::ObjectA* m_objectA;
};
}
ObjectB.cpp
#include "ObjectB.h"
#include "ObjectA.h" // ObjectA.hをここで読み込む
using namespace NameB;
ObjectB::ObjectB() : m_objectA((NameA::ObjectA*)0)
{
}
ObjectB::~ObjectB()
{
// オブジェクト破棄
if (m_objectA != (NameA::ObjectA*)0)
{
delete m_objectA;
m_objectA = (NameA::ObjectA*)0;
}
}
NameA::ObjectA* ObjectB::createObjectA()
{
if (m_objectA == (NameA::ObjectA*)0)
{
// オブジェクトが無い場合に作成
m_objectA = new NameA::ObjectA();
}
return m_objectA;
}
- 2008/09/27(土) 21:40:20|
- 計算機
-
| トラックバック:0
-
| コメント:2
凄く勉強になります(会社では全く使わないけれども、、、)
- URL |
- 2008/09/28(日) 14:40:26 |
- N.d #eqP7eH0Y
- [ 編集]