抽象クラスを使用してインスタンスの配列にメモリを割り当てる方法?
-
21-08-2019 - |
質問
私はC ++で純粋仮想メソッドを定義する抽象クラスを持っています:
class Base
{
Base();
~Base();
virtual bool Test() = 0;
};
私は今、これらのいずれかの配列を作成したいI等A、B、C、と呼ぶだろう、(テスト()の実装を提供する)他のクラスの数でこれをサブクラス化していますこの基本クラスを使用しての種類:
int main(int argc, char* argv[])
{
int size = 0;
Base* bases = new Base[10];
bases[size++] = new A();
bases[size++] = new B();
for (int i = 0; i < size; i++)
{
Base* base = bases[i];
base->Test();
}
}
(私が作ったかもしれないすべてのエラーをすみません、私は簡単な例を提供するために、その場でこれを書いている)。
問題は、それが(それは抽象的だとして、それは行うことはできません)基本クラスのインスタンスを作成する必要になると私は配列をインスタンス化することはできませんです。しかし、これを実行せずに、それは、配列のインデックスに割り当てるために必要なメモリを割り当てられていないので、そのメモリにアクセスしようとセグメンテーションフォールトが用意されています。私はそれが新しいミックスし、mallocとfreeを削除することをお勧めではないという印象の下に思います。
これは、私がこれを使用する必要があると私はテンプレートまたはこれを行うには、いくつかの他のメカニズムを使用しようとしなければならないが、うまくいけば、私は私がしようとしてるものを説明するのに十分な情報を提供してきました道を混同していることかもしれません。
それでは、これを行うための最善の方法であり、どのように私は抽象クラス?
にメモリを割り当てるのこの問題を回避するだろうおかげで、 ダン
解決
そのコードのわずかな誤解があります。代わりにベースオブジェクトを割り当てるのは、ポインタを割り当てる必要があります。ポインタは、任意の時点で存在することができます。 、不完全型へ、さらには無効に抽象クラスへのポインタが有効である。
int main(int argc, char* argv[])
{
int size = 0;
Base** bases = new Base*[10];
bases[size++] = new A();
bases[size++] = new B();
for (int i = 0; i < size; i++)
{
Base* base = bases[i];
base->Test();
}
}
他のヒント
まず、あなたのデストラクタは仮想として宣言されていることを確認します:
virtual ~Base();
あなたはインスタンスへのポインタの配列を格納方がいいでしょう。
Base** bases = new Base *[10];
アレイは、同じサイズのもので、その要素のすべてに依存しています。あなたが同じ塩基から誘導されるC ++のクラスを持っている場合は、インスタンスがすべてで任意のサイズにすることができます。だから、ベースが抽象的であるかどうかに関係なく、あなたはベースインスタンスの配列を割り当てることができない、とそこ導出インスタンスを配置します。
他の回答が言うように、あなたはポインタを使用する必要があります。アレイ内のそれらの様々な派生インスタンスとストア・ポインタを割り当て、次にベースへのポインタの配列を割り当て、及び