自作のクラスを利用するには?

解決


村崎  2003-08-28 15:22:06  No: 52014  IP: [192.*.*.*]

初めて質問させていただきます。
C++を勉強し始めてクラスを作る段まできたのですが、
「クラスAがメンバとしてクラスBを持ち、
  クラスBはメンバとしてクラスAのポインタを持つ」
という感じのものをつくろうとしたのですが、どうもうまくゆきません。

クラス宣言を眺めてもどこがだめなのか分からず、途方にくれています。
どなたか、だめな点、「あれは設定してあるのか」みたいなものの指摘をしていただけませんでしょうか。
何卒よろしくお願いいたします。

クラスA・・・CManagerialCoop
クラスB・・・CGameManager

--↓ManagerialCoop.h--
#ifndef MANAGERIAL_COOP_H_INCLUDED
#define MANAGERIAL_COOP_H_INCLUDED
#include "GameManager.h"
class CManagerialCoop{
public:
  CGameManager  gameman;
  //略)
};
#endif //MANAGERIAL_COOP_H_INCLUDED
--↑ManagerialCoop.h--

--↓GameManager.h--
#ifndef GAME_MANAGER_H_INCLUDED
#define GAME_MANAGER_H_INCLUDED
#include "ManagerialCoop.h"
class CGameManager{
  CManagerialCoop*  coop;
  //(略)
}
#endif //GAME_MANAGER_H_INCLUDED
--↑GameManager.h--

--エラー--
n:\01\t\ka_\managerialcoop.h(6) : error C2146: 構文エラー : ';' が、識別子 'gameman' の前に必要です。
n:\01\t\ka_\managerialcoop.h(6) : error C2501: 'CGameManager' : 識別名を宣言するのに、型が指定されていません。
n:\01\t\ka_\managerialcoop.h(6) : error C2501: 'gameman' : 識別名を宣言するのに、型が指定されていません。

編集 削除
tetrapod  2003-08-28 15:40:49  No: 52015  IP: [192.*.*.*]

互いに依存関係のあるクラスを使いたいなら
#include "ManagerialCoop.h" の場所を後ろにずらし、

class CManagerialCoop;
class CGameManager {
...
};
のようにクラス名の先行宣言をしてください。
先行宣言だけでは CGameManager の中から CManagerialCoop のメンバを
使うことは出来ないので、その辺は #include の位置をうまくいじります。

相互依存するクラスって設計自体があまり美しくないと思うので、
設計そのものを見直すのも有り。

編集 削除
村崎  2003-08-28 16:01:33  No: 52016  IP: [192.*.*.*]

お答え頂きまして、どうもありがとうございます。

--↓GameManager.h--
#ifndef GAME_MANAGER_H_INCLUDED
#define GAME_MANAGER_H_INCLUDED
class CManagerialCoop;
class CGameManager{
  CManagerialCoop*  coop;
  //(略)
};
#include "ManagerialCoop.h"
#endif //GAME_MANAGER_H_INCLUDED
--↑GameManager.h--

>その辺は #include の位置をうまくいじります。
というのがよくわからなくて上記のようにしてみたのですが、
えーと、状況は変わらない感じです。

>設計そのものを見直すのも有り。
うーん。別の形での方法が思い浮かばないのです…。

編集 削除
tetrapod  2003-08-28 16:29:32  No: 52017  IP: [192.*.*.*]

次のような簡単なコードはコンパイルできました。
--test1.h--
#if !defined(TEST1_H_INCLUDED)
#define TEST1_H_INCLUDED

#include "test2.h"

class test1 {
    test2 t2;
public:
    test1() {}
};


#endif
--test2.h--
#if !defined(TEST2_H_INCLUDED)
#define TEST2_H_INCLUDED


class test1;
class test2 {
    test1* t1;
public:
    test2() : t1(0) {}
};


#endif
--test.cpp--
#include "test1.h"
#include "test2.h"

int main() {
    test2 t2;
    test1 t1;
    return 0;
}
--end--
タイプミスとかありませんか?

編集 削除
村崎  2003-08-28 19:47:55  No: 52018  IP: [192.*.*.*]

わ、わ、同じような構成になっている他のクラスの部分を変更し忘れていたようで、
そちらも教えていただいたように直したらコンパイルが通るようになりました。

tetrapodさん、どうもありがとうございました。

編集 削除