現在、おおよそ次のようなクラス階層を設計しています。
struct Protocol
{
// Pass lower-layer protocol as a reference.
Protocol(Protocol & inLLProtocol) :
mLLProtocol(inLLProtocol)
{
}
// A protocol "always" has a LLProtocol.
Protocol & mLLProtocol;
};
struct Layer1Protocol : Protocol
{
// This is the "bottom" protocol, so I pass a fake reference.
Layer1Protocol() : Protocol(*static_cast<Protocol*>(nullptr)) {}
};
参照へのIIRCバインディングは*nullptr
、参照がアクセスされない限り安全です。したがって、それを防ぐような方法で Layer1Protocol クラスを設計するのは私の責任です。
すべてのユーザー プロトコル インスタンスがそれぞれの下位層プロトコルへの参照を持つようにするため、このアプローチが気に入っています (Layer1Protocol は例外ですが、コア ライブラリの一部です)。これは、ポインターを使用するよりも好ましいと思います。ポインターが導入されると、null ポインターを渡すことが可能になり、実行時にチェックする必要が生じる可能性があり、その結果、多くのポインター チェック コードと時折のバグが発生するからです。
私の参照ベースのアプローチは擁護できると思いますか? それとも、null 参照を使用するのは常に悪い習慣ですか?