より良いインターフェイスを提供するために、いくつかの自動生成されたクラスのラッパーを作成しています。問題を示すために簡単な例を書きました。
クラスXのオブジェクトへのポインターを持つクラスAがあり、クラスYのオブジェクトへのポインターを持つクラスB(Aを継承)があります(Xを継承します)。
X と Y へのポインターを格納する最善の方法がわからないことを除けば、それで問題ありません。クラス A と B のオブジェクトのコレクションを、それらがすべて A であるかのように (X へのポインターを使用して) 操作できる必要があります。私が必要とするのはそれだけです)、これは以下の私の例でうまくいきます。
私の実際の質問は、クラス X ではなくクラス Y オブジェクトを操作する必要があるクラス B のケースをどのように処理するのが最善かということです。この変数を使用するたびに繰り返しキャストし、作成した A を継承するクラスごとに異なる名前 (getY など) のメソッドを定義しなければならないのは、ぎこちなく感じます。getY を呼び出す必要がある doStuff のような多くのメソッドが存在する可能性があります。
class X {
private:
int i;
public:
X(int i) : i(i) {}
int getI() {
return i;
}
};
class Y : public X {
private:
int j;
public:
Y(int i, int j) : X(i), j(j) {}
int getJ() {
return j;
}
};
class A {
protected:
X* x;
public:
A(X* a) : x(a) {}
X* get() {
return x;
}
};
class B : public A {
public:
B(Y* y) : A(y) {}
private:
//I could create a new function for each class like class B
Y* getY() {
return (Y*)x;
}
public:
void doStuff() {
Y* y = getY();
y->getJ();
std::cout << "J: " << y->getJ() << cout::endl;
}
};
メインから抜粋:
X* x = new X(5);
Y* y = new Y(5,6);
B b(y);
b.doStuff();
私に発生する1つの代替案は、クラスBIを構築するときに、Xに設定されている場所と同じ場所を指すタイプY変数のポインターを初期化できるということです。私のポインターがconstである限り、それは異なるものを指す 2 つの参照。
どんなアイデアでも大歓迎です。
ありがとう。