純粋仮想関数
最近、一年ぶりぐらいにC++を触っていて、いろいろ悲鳴をあげています。
C++の文法はかなりうろ覚えでコンパイルエラーの度に一つずつ思い出していくといった状況なのですが、
次のようなリンクエラーの原因が分からずに途方に暮れてました。
% g++ -Wall main.cpp hoge.cpp /tmp/cc3w1mAb.o(.gnu.linkonce.r._ZTV4Test+0x10): undefined reference to `Hoge::hoge(int)' collect2: ld はステータス 1 で終了しました
半日悩んでようやく解決。
純粋仮想関数を示すキーワード(Javaの"abstract")が無いんだっけ?と思って
宣言だけして中身の実装が無いメソッドを置いていたのが原因で、
// interface class Hoge { public: virtual int hoge(int n) = 0; };
というふうに、ちゃんと "= 0" をつけたら通った。
そういえばこういう宣言の仕方をするんだよねぇ…。
NULL も 0 と書いた方がいいらしいですし。
イメージ的にはメンバ関数は宣言しっぱなしじゃなく、必ず何らかの「定義」が必要という感じか。
コンパイルエラーじゃなくてリンクエラーになるんだな。