C++トリビアルメモ1

すごい簡単に作れるので作ってみた。
http://kosumi.myminicity.com/
コスミー町です。訪れてくれると育つらしい。

ひさびさにC++をさわるといろいろバグる・ハマる。というのは以前にも言った気がする。

1.クラスの前方宣言とインスタンス
例えばfriendを使う場合、friendしたいクラスを認識するにはfriendする前にそのクラスが宣言されていないといけない。つまり、


class HogeTester;   // 前方宣言

class Hoge {
   friend HogeTester;

private:
   int foo;
   void bar();
};

みたいな感じで型だけを先に宣言する「前方宣言」が必要となる。これを使わないとHogeTesterの中でHogeを使いたいはずだから入れ子になってしまう。
で、これはいい。これはいいんだけど、これに習って例えば内部クラスの定義を下のほうに書きたいなーとか思うとハマる。


class Hoge {
public:
   class Foo;
   Foo bar;

   class Foo {
   public:
      int a;
   };
};

これは無理。barがインスタンスなため、Fooのデータサイズが分からないとコンパイルのしようがないんだろう。よく考えればそりゃそうかもしれないが、Javaとかやってるとこれくらい許してほしいと思ってしまう。
コンパイル可能なのは


class Hoge {
public:
   class Foo {
   public:
      int a;
   };

   Foo bar;
};

あと、以下のような場合はOKっぽい。


class Hoge {
public:
   class Foo;
   Foo *bar;
   Hoge() { bar = new Foo(); }

   class Foo {
   public:
      int a;
   }
};

ポインタのため。

あと2個ほどはまったんだけど、意外と長くなったのでエントリ分けることにする。
ああそうだ、しょーもない話では


double a = 2/3;

としたらaが0になってはまった。スクリプト言語ばっかやってるとこうなる(スクリプト言語でも気をつけろという話だろうが)
正しくは


double a = 2.0/3.0;

小数点をつけないとintに丸められてしまうとさ。

以上

コスミー について

昔(?)はゲーム作ってました。 今もなんか作ろうとしています。
カテゴリー: C++, C言語 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。