staticメンバ変数(クラス変数)がundefined reference。
BCCでのエラーメッセージは、
「Error: 外部シンボル 'Printer::bug' が未解決」です。
[main.h]
class Printer { public: Printer(); void print(); static Printer bug; char* str; };
[main.cpp]
#include <iostream> #include "main.h" Printer::Printer(){ str = "Ok"; } void Printer::print(){ std::cout << str;} int main() { Printer p; p.print(); Printer::bug.print(); }
クラスPrinterは、クラス共通のオブジェクトbugをもっています。
しかし、そのbugがエラーになってしまいました。
単純なことですが、クラス変数Printer::bugは宣言しただけで、初期化を忘れていました。
main.cppの中にクラス変数の定義?初期化?を一文加えるとOkです。
関数の宣言と定義の違いはまだわかりやすいですが、変数はあまり宣言と初期化を意識して区別していなかったので、ちょっと戸惑いました。
[main.cpp]
#include <iostream> #include "main.h" Printer Printer::bug; // ※ static変数の定義をする Printer::Printer(){ str = "Ok"; } void Printer::print(){std::cout << str; } int main() { Printer p; p.print(); Printer::bug.print(); }
クラス変数や定数の宣言と初期化(あるいは初期値の表明といってもよいけど)が離れてしまうのは、ほかの言語と比べても ちと書きにくくないでしょうか。なんかいい方法がありませんかね?
プログラミング言語C++第4版(2015, ビャーネ・ストラウストラップ; 初版1986)
C++の原典。言語設計者の著作だからこそ、ほかの本で「わかったつもり」になっている部分が、クリアになると思います。