すごい簡単に作れるので作ってみた。
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に丸められてしまうとさ。
以上