インクルードガードで相互参照

大体C++の片通りの使い方が分かったので、次は実装だとなった段で、相互参照で躓きまして、hogeとpiyoというクラスを定義して、hogeでpiyoのメンバを、piyoでhogeのメンバを参照しようとしたら、そんなクラス知らねーよ坼ぉけっていわれて困ってたのをネ申Nunockyさまに救って頂きました。
ネ申は全知全能の視座に立ち、そして常に寛大であるものです。きっと彼は巨人の片の上に立っているに違いない*1
そういうことで、

//  hoge.h
#ifndef __PIYO__
#define __PIYO__

class piyo;
class hoge {
public:
  double Rho, V, P;
  double dP1 (double K, piyo *Piyora);
}

hoge.hを定義して、ifndef(IF Not DEFinedの略らしい)で__PIYO__のマクロを定義してなかったら、読み込んで、とかして、ヘッダファイルを1度だけしか読み込まないようにして、更にpiyoのオブジェクトを取り敢えずポインタということにして誤魔化しておくらしい。
同様に、piyo.hでは、

//  piyo.h
#ifndef __HOGE__
#define __HOGE__

class hoge;
class piyo {
public:
  double U, A;
  double Flow (hoge *Hogera);
};
#endif

にしておく。
main文では、

#include <iostream>
#include "hoge.h"
#include "piyo.h"

double hoge :: dP1 (double K, piyo *Piyora) {
  cout << Piyora->Rho << endl;
  return 0.0;
}

double piyo :: Flow (hoge *Hogera) {
  cout << Hogera->U << endl;
  return 0;
}

int main () {
  piyo Piyora;
  hoge Hogera;

  Piyora.Rho = 1.0;
  Hogera.U = 0.1;

  Hogera.dP1 (1.0, &Piyora);
  Piyora.Flow (&Hogera);

  return 0;
}

でやると多分いける。Makefileは特に考えることはなくて、

$ make

でいけるはず。つか、gcc以外の環境のことは余りよく知らない。というのが今後もしGUIを作ろうとしたら大きな問題になって来る気がするんだけど、どうなんだろう。取り敢えずVisualStudioExpress5.xだとか、6.xだとかその辺を使えば良いんだろうか。フリーだし。俺のGUIなんてどーせ値の入力くらいしか使わないし。つか、C++の何が良いって、GUIAPIが豊富にあるので、っていうのも魅力の一つなんですよねー。と思いつつ、中々そっちの方に手が付けられてないんですがね。
あと、GUILinuxで実装するときはx11とか、その変になるのかなあ。それも調べないとなあ。MacだとCocoaとかなんだろうか。しかしCocoaにはObjectiveCとかいうのがあった気がするんだけど、それはきっと幻。。。

*1:ref. I.Newton.