まだ、時計を飼ってたりするんですが、なんか、3000時間になってました。125日か。別にどうってことはないんですが。
昨日は、楽勝でカレーが食べられるペースで学生のプログラムの面倒を見てたんですが... 最後に、C++ の Pure virtual class ではまりました。
最近のオブジェクト指向言語では、Interface/Abstract Class は必須なんだけど、C++ には、Interface はない...
で、virtual function ってのを使うわけなんだけど、これは、vtable っていう隠れたテーブル上から検索される。別に、Hoge.h に virtual void hoge(); って書いて、これを class Haga : public Hoge とかく。
なんだが、まず、
virtual を継承するなら、Haga の virtual destructor を書け
と言ってくる。まぁ、それは書けば良いんだが、そうすると、リンカが、
Z12TVHoge undefined
とか言ってくる。謎過ぎなんだよ... これは、mangling とか言って、型をencode したシンボルんだよね。これで、同じ名前でも型が違う関数(Polymorphism)を実装している。
経験的に、これはconstructorだってのはわかっているので、Hoge.h に、
Hoge() {}
とか書くんだが、全然、直りません。nm とか追うんだが、Haga から Hoge() を呼んでいるっぽいが、Hoge() が定義されてない。定義されるとすれば、Hoge.o か。そういえば、Hoge.cc って書いてないし。Hoge.h だけじゃだめなのか? pure virtual なのに? ってわけで、
Hoge.cc に、Hoge() {}
と書く。すると、Duplicate と言われるので、Hoge.h の Hoge() {} は、Hoge(); に直す。はぁ。
そうすると、今度は、
ZV12THogeVhoge undefined
とか言ってくる。あー、もう、いったいなんなんだ。nm すると、HagaVhoge とかはある。あ、そうか。Hoge.h に、
virutal hoge() = 0;
て書くらしい。そんなのエラーメッセージからは、わかんねよ。
要するに、C++ では、Pure virutal class は使っちゃだめで、実装のある class を 中途半端に継承しろってことらしいです。
おかげでカレーを食べ損なって、我流に行って来ました。
龍麺伝説 我流家 - てだこラーメンデータベース http://bit.ly/79D1Sp
No comments:
Post a Comment