私はこの設計上の問題に遭遇しました。ストーリーは次のとおりです。
次のようないくつかのメソッドを定義する基本クラスがあります。
virtual double & f(double x);
基本クラスはそれらの1つを呼び出して、いくつかのクエリに応答するときにサブクラス内のいくつかのデータへの参照を要求します。問題は、これらのfメソッドがサブクラスのオプションのデータを返すことです。つまり、サブクラスによっては、fが返すように要求しているものがまったく存在しない場合があります。基本クラスのロジックは、サブクラスが存在しない場合にそのようなf()を呼び出さないことを保証できるため、原則として、このサブクラスはこのメソッドを実装する必要はありませんが、サブクラスはインスタンス化可能である必要があるため、メソッドは純粋な仮想です。不便なことに、fの戻り型は参照である必要があるため、単純にジャンク値を返すことはできません。
したがって、基本的に私はダミー参照を返す「エレガントな」方法を探しています。これは、プログラムが正しく機能していればとにかく呼び出されませんが、理想的には、誤った呼び出しをキャッチすることでデバッグに役立ちます。fの署名は読みやすさにとって重要なので、理想的には変更したくありません。
クラスでダミーのstaticdoubleDATA_NOT_EXIST変数を宣言して返すことができると思いますが、少し見苦しいようです。より良いアイデアはありますか?必要なときに「null」参照を返すためのお気に入りの方法は何ですか?
前もって感謝します。
編集:
これらのメソッドを基本クラスに保持したいのですが、基本クラスはすべてのサブクラスに適用できないロジックを処理しようとしているため(これ自体が悪い設計ですか?)、代わりにサブクラスで宣言した方がよいようです。このようなもの:基本クラスはマウスを表し、サブクラスのオプションのデータは左/中央/右ボタンを表します。特定のサブクラスには特定のボタンがない場合がありますが、ボタンがある場合とない場合があることを前提として、基本クラスはボタンのクリックを処理します。
編集:これが私がやろうとしていることを説明するためのいくつかのソースコードです。基本クラス:
#include <cassert>
struct Base
{
double & basef(int x)
{
assert(x >= 0 && x < 20);
if (x < 10) return f1(x);
else return f2(x);
}
virtual double & f1(int x);
virtual double & f2(int x);
};
struct Sub1 : Base
{
double & f1(int x) { return a[x]; }
double & f2(int x) { return b[x - 10]; }
double a[10];
double b[10];
};
struct Sub2 : Base
{
double & f1(int x) { return a[x]; }
double & f2(int x) { /* nothing to return here! */ }
double a[10];
};