FC2ブログ

水雲風

とりあえず人生を記録と妄想の吐き出しの地

C++の相互参照クラスの定義(2008/09/27)

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

■クラス図

※ NameA、NameBは名前空間です。
class080927.png
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;
}
スポンサーサイト



  1. 2008/09/27(土) 21:40:20|
  2. 計算機
  3. | トラックバック:0
  4. | コメント:2
<<釣り | ホーム | 3回目の海釣り>>

コメント

凄く勉強になります(会社では全く使わないけれども、、、)
  1. URL |
  2. 2008/09/28(日) 14:40:26 |
  3. N.d #eqP7eH0Y
  4. [ 編集]

仕事ではだいたいこんな感じでコードを書いてますね
  1. URL |
  2. 2008/09/29(月) 21:18:15 |
  3. おげれつ脱脂綿 #XSpOQyYU
  4. [ 編集]

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://mechagappa.blog14.fc2.com/tb.php/603-52fe5494
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

おげれつ脱脂綿

カレンダー

01 | 2020/02 | 03
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29

カテゴリー

月別アーカイブ(タブ)

最近の記事

最近のコメント

最近のトラックバック

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

RSSフィード

全ての記事を表示する

全ての記事を表示する