クラス A があり、そのクラス定義内に次の内容があります。
static QPainterPath *path;
つまり、パス オブジェクトへの静的 (クラス全体) ポインターを宣言しています。このクラスのすべてのインスタンスは、同じ共有データ メンバーを持つことになります。このクラスを基にして、より特殊な形式にサブクラス化し、動作を階層化し、各クラスが独自のパス オブジェクトを持つようにしたいと考えています (ただし、境界ボックスの計算やペイント ルーチンの呼び出しなどの退屈な部分を繰り返す必要はありません)。
これをサブクラス化してクラス F を作成する場合、F では A から継承した描画ルーチンを使用する一方で、F で宣言された静的 (クラス全体) パス オブジェクトを使用するようにします。上記の宣言をプライベート セクション (派生クラス F で繰り返す) で実行したり、保護セクションに実行したりしてみましたが、いずれもうまくいきませんでした。
なぜこのようなことが起こるのかは、ある程度わかります。
void A::paint() {
this->path...
オブジェクトがクラス F であっても、F::path ではなく A::path を参照しています。
これを回避し、基本クラスで定義された描画コードを使用しながら、すべてのクラス (おそらく基本クラスを除く) を実際のクラスにしてインスタンス化できるようにしながら、各クラスが静的パス オブジェクトを維持できるようにするエレガントな方法はありますか?
ベストアンサー1
仮想メソッドを使用して、静的変数への参照を取得します。
class Base {
private:
static A *a;
public:
A* GetA() {
return a;
}
};
class Derived: public Base {
private:
static B *b;
public:
A* GetA() {
return b;
}
};
ここで、B は A から派生していることに注意してください。次に、次のようになります。
void Derived::paint() {
this->GetA() ...
}