• ベストアンサー

互いのクラスで互いのクラスのポインタを持ち合う方法

◆hoge.h #pragma once #include "fuga.h" class Choge{ protected:  Cfuga *fuga; public:  Choge( void ){ fuga=new hoge(this); }  ~Choge(); }; ◆fuga.h #pragma once #include "hoge.h" class Cfuga{ protected:  Choge *hoge; public:  Cfuga( hoge *h ){ hoge=h; }  ~Cfuga(); }; このように互いのポインタを持ち合うようなクラスを作りたいのですが、 下記のようなエラーが出てどうにもうまくいきません。 c:\...\hoge.h(5) : error C2143: 構文エラー : ';' が '*' の前にありません。 c:\...\hoge.h(5) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません c:\...\hoge.h(5) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 環境はVisualC++2005(ExpressEdition)、WindowsXPです。 どうすれば実現できるでしょうか?

  • dmq
  • お礼率37% (46/124)

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

ヘッダファイルをインクルードするのではなく、先行宣言だけにしましょう。 class Choge; class Cfuga;

dmq
質問者

お礼

ご回答ありがとうございます。 先行宣言だけでも引っかかるようなのでインクルードもしたところうまくいきました。

その他の回答 (2)

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.3

クラスに限らずモジュール同士が相互依存する関係は 設計的に見てもプログラム的に見ても良くないので 他の方法を検討することをお薦めします。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

>  Cfuga( hoge *h ){ hoge=h; } とか >  Choge( void ){ fuga=new hoge(this); } で ナニをやりたかったのかよくわかりませんが、 てきとーに推測してみて、こんなことをしたかった? -- hoge.h #pragma once #include "fuga.h" class Choge{ protected: Cfuga *fuga; public: Choge( void ){ fuga = new Cfuga(this); } ~Choge() {}; }; -- fuga.h #pragma once class Choge; class Cfuga{ protected: Choge *hoge; public: Cfuga(Choge *h){ hoge=h; } ~Cfuga() {}; }; -- moge.cpp #include "hoge.h" #include "fuga.h" int main() { Choge h; }

関連するQ&A

  • 基本クラスに派生クラスのインスタンスを持たせたいのですが.....

    A.h//////// #pragma once #include "B.h" class A{ B* b; } B.h/////// #pragma once #include "A.h" class B : public A{ } ////////////// 上のようなクラス構成にさせたいのですが..... #include "A.h"をB.hに追加したところでエラーが出ます。 基本クラスに派生クラスのインスタンスを持たせたいのですが.... どのようにすれば良いでしょうか? エラー内容は : error C2143: 構文エラー : ';' が '*' の前にありません。 : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません この三つが出ます。 何方かよろしくお願いしますm(_ _)m

  • 相互のインクルードファイルの方法について

    下のように、2つのヘッダーファイルを相互にインクルードすると colorparettewindowclass.h(2) : fatal error C1014: インクルード ファイルが多すぎます : 深さ = 1024 というエラーが表示されます。(2つ表示される) 一応、#pragma onceを使用していますが、 エラーになります。 どうすればいいでしょうか? よろしくお願いします。 --------------------------------------------- <<ColorParetteWindowParentClass.h>> #include"WindowBaseClass.h" #include"ColorParetteWindowClass.h" #include"ColorClass.h" #pragma once class ColorParetteWindowParentClass : public WindowBaseClass { ((処理関数等定義)) }; --------------------------------------------- <<ColorParetteWindowClass .h>> #include"WindowBaseClass.h" #include"ColorParetteWindowParentClass.h" #pragma once class ColorParetteWindowClass : public WindowBaseClass { ((処理関数等定義)) };

  • winnetwk.hについて

    ネットワークプロバイダーのバージョンなどを表示されるプログラムを実行しようとしたのですが、以下のようなエラーがでて先に進めません。どうしたら直すことが出来るでしょうか? 1>c:\program files\microsoft platform sdk\include\winnetwk.h(142) : error C2146: 構文エラー : ';' が、識別子 'dwScope' の前に必要です。 1>c:\program files\microsoft platform sdk\include\winnetwk.h(142) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 1>c:\program files\microsoft platform sdk\include\winnetwk.h(142) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 1>c:\program files\microsoft platform sdk\include\winnetwk.h(143) : error C2146: 構文エラー : ';' が、識別子 'dwType' の前に必要です。 1>c:\program files\microsoft platform sdk\include\winnetwk.h(143) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 1>c:\program files\microsoft platform sdk\include\winnetwk.h(143) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 1>c:\program files\microsoft platform sdk\include\winnetwk.h(144) : error C2146: 構文エラー : ';' が、識別子 'dwDisplayType' の前に必要です。 1>c:\program files\microsoft platform sdk\include\winnetwk.h(144) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 1>c:\program files\microsoft platform sdk\include\winnetwk.h(144) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 1>c:\program files\microsoft platform sdk\include\winnetwk.h(145) : error C2146: 構文エラー : ';' が、識別子 'dwUsage' の前に必要です。 1>c:\program files\microsoft platform sdk\include\winnetwk.h(145) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 1>c:\program files\microsoft platform sdk\include\winnetwk.h(145) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 1>c:\program files\microsoft platform sdk\include\winnetwk.h(146) : error C2146: 構文エラー : ';' が、識別子 'lpLocalName' の前に必要です。 1>c:\program files\microsoft platform sdk\include\winnetwk.h(146) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 1>c:\program files\microsoft platform sdk\include\winnetwk.h(146) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 1>c:\program files\microsoft platform sdk\include\winnetwk.h(147) : error C2146: 構文エラー : ';' が、識別子 'lpRemoteName' の前に必要です。 環境はVC++2005です。

  • VisualC++でクラスのヘッダーファイルの書き方がわかりません

    今、Visual C++(CLR)を使って、MultiClassという名前のクラスを作っています。 クラスの作り方は大体わかったのですが、 疑問が出ました。以下のように記述するとエラーが発生してしまいます //クラスのヘッダーファイル #pragma once ref class MultiClass { public: void MultiClass(void); }; //クラスのCPPファイル #include "StdAfx.h" #include "MultiClass.h" void MultiClass::MultiClass(void) { } //エラー名 エラー 1 error C2380: 前の型 'MultiClass' (コンストラクタが戻り値の型を返すか、またはクラス名を再定義しています。) エラー 2 error C2533: 'MultiClass::{ctor}' : コンストラクタの宣言に戻り値の型が含まれています。 ヘッダーで先頭voidを消して、CPPの先頭voidを消したら正常に 動作するのですが、普通、 戻り値 メソッド名 (引数) なのに、なぜエラーが発生するのですか? さらに2行目以降はなぜ、 void を先頭につけないと エラー 2 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません というエラーが発生するのでしょうか? ネットで調べてもまったくわかりません わかる方お願いします

  • 添字演算子

    #include <iostream> class hoge{ private: int a; public: hoge(){ a = 0; } int operator+(int fuga){ a = a + fuga; return a; } int operator[](int fuga){ return 1; } }; int main(){ hoge* p; p = new hoge; std::cout << ((*p) + 5) << std::endl; std::cout << ((*p)[1] ) << std::endl; // 5 // 1 // std::cout << ((*p) [] 1); エラーです。何故ですか? }

  • お互いをメンバに持つようなクラスの宣言

    同じヘッダファイル内で class CHoge { CPiyo piyo; //この段階ではCPiyoがわからない }; class CPiyo { CHoge hoge; //こっちを先にしてもCHogeがわからない }; といったようにお互いのオブジェクトをメンバに持つようなクラスを宣言したいのですが、CHogeの宣言を解釈する段階ではCPiyoが宣言されていないので、エラーになります。 そもそも、こういうことってできないのでしょうか?

  • Visual C++ 2005 MFCアプリのクラス作成について

    Windows XP SP3 Visual C++ 2005 pro MFCアプリケーション シングルドキュメント 以上の環境でアプリケーションを作りたいと思っています。 C++は、C言語をベースという意味ではそれなりにはわかっているつもりです(自信はないですが...)。 本当はSDKを学んだ方がよろしいんでしょうが、時間の都合上MFCでやることにしました。 ちなみに、VC++を使ったプログラミングは初めてのものです。 そこで質問なのですが、 通常のC++においてクラスを作るときは、cppファイルとhファイルで分けてつくってmainのcppでインクルードしますよね。 VC++ MFCも 「C++クラスの追加」 でウィザードを利用してあるクラスAを作成てみまして、わかる方にはわかるでしょうけど、もちろん以下のように出力されました。 A.h------------------ #pragma once class A { public: A(void); public: ~A(void); }; A.cpp---------------------- #include "A.h" #include "StdAfx.h" A::A(void) { } A::~A(void) { } そしてとりあえず、その状態で何も手を加えずにとりあえずコンパイルにかけてみたところいきなり以下のようなエラーが出ました。 error C2653: 'A' :識別子がクラス名でも名前空間名でもありません。 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません warning C4508: 'A' : 関数に戻り値の型が指定されていません。戻り値を void 型と見なします。 error C2653: 'A' : 識別子がクラス名でも名前空間名でもありません fatal error C1903: 直前のエラーを修復できません。コンパイルを中止します 何も手を加えていない状態でこのようなエラーが出るということは、どこかでこのhやcppをインクルードする必要があるのだろうとは思います(でもそういう類のことはウィザードで作成した際に、VC++が自動でコーディングしてくれたりしないのでしょうかね...)。 むしろ、MFCでこのような単純なC++クラスを作ること自体があまり好まれないことなのでしょうか。 もちろんこのクラスを作っていってから、ある処理をさせていこうと思っているので、自分としては以前から行っていたC++のようにコーディングしていきたいと思うのですが、もし好ましくないようならどのファイルにMFC的ではない、ただのC++的なクラスを定義したりすればよろしいのでしょうか。 もしくは、好ましくなくても何らかの対処方法があれば教えていただきたく思います。 Webで調べても MFCクラスの作成などのことしか書いてないので、ちょっとわからなくて困っています。よろしくお願いします。

  • C++のヘッダーについて

    C++のプログラミングをしています そこで出てきた問題なのですが・・・ class Aのヘッダファイルa.hをほかのcppファイルにインクルードすると、 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません error C2146: 構文エラー : ';' が、識別子 'test' の前に必要です。 とほかのヘッダファイルでコンパイルエラーがでます ヘッダファイルをインクルードしたときのみこのエラーがでて困っています。 解決法や、ヒントになりそうな事例を知りませんでしょうか?

  • クラスを公開する部分を制限するには?

    以下の例のようなクラスを書きました。 ========================== #include<Hoge.h> class Moge{ public:  int getCountHoge(void); private:  Hoge* d; }; ========================== これをライブラリとして、他の人に使ってもらうように 公開しようと考えています。 ただ、上記のままヘッダーファイルを配ってしまうと、 使用者にとって不要だと思われる Hoge.h の include が 発生してしまいます。 実際には、Hoge.h は 他のクラスを使用したり、 inline 関数などを多用した少々重い実装となっています。 なんらかの方法で、これを抑制できないでしょうか? 試しに以下のようにprivate 部分を削除したヘッダーファイルを 公開用に別途用意してみましたが、実行時エラーとなってしまいました。 (ライブラリコンパイル時は元のヘッダーファイルを使用して、 使用者側ソースは下記ヘッダーファイルを使用しました。) ========================== class Moge{ public:  int getCountHoge(void); }; ========================== よろしくお願いします。

  • 任意の型のポインタを格納する場合

    構造体にて、任意の型のポインタを指定できるアドレス格納変数を作成し(下記 hoge_tのメンバaa) そこに任意の型(下記fuga1_t、fuga2_t)を指定できるようにしたいと思っております。 下記コードにて所望の動作ができておりますが、こういう場合はこういう書き方をするものだ、 というものがあればお教え下さい。 (または下記記載の通りで正しい場合はこの書き方で問題ない、などいただけると助かります) #include <stdio.h> ///////////////////子struct typedef struct{ long num; long test; }fuga2_t; typedef struct{ int num; int test; }fuga1_t; ////////////////////親struct typedef struct{ int *aa; //ここにfuga1、fuga2両方設定したい場合がある }hoge_t; int main(void){ hoge_t hoge1; hoge_t hoge2; fuga1_t fuga1; fuga2_t fuga2; //初期化 fuga1.test = 10; fuga2.test = 11; //代入 hoge1.aa = (int*)&fuga1; hoge2.aa = (int*)&fuga2; printf("%d \n", (((fuga1_t*)(hoge1.aa))->test)); printf("%ld \n", (((fuga2_t*)(hoge2.aa))->test)); return 0; }

専門家に質問してみよう