エラー: 抽象クラスをインスタンス化できません

Era Chou Xiangkurasuwoinsutansu Huadekimasen



この記事は、コード内で抽象クラスを操作しているときによく発生する別のエラーについてです。オブジェクト指向プログラミングにおける抽象クラスの概念を学びましょう。それ自体からオブジェクトを作成できないクラスは、抽象クラスと呼ばれます。 C++ 言語ではインターフェイスとも呼ばれます。 C++ 言語では、純粋仮想関数を宣言することにより、任意のクラスを抽象化できます。仮想関数を宣言するには、関数の後に「=0」を配置する必要があります。抽象クラスは、他のすべての子クラスが派生する親または基本クラスとして機能します。したがって、抽象クラスにアクセスするには、基本クラスから継承する必要があります。抽象クラスをインスタンス化しようとすると、コンパイル エラーが発生します。

構文

私たちのエラーのエラーメッセージは次のとおりです。

エラー : 変数 ‘ ’ を抽象型 ‘’ として宣言することはできません

空の括弧内には、変数と抽象クラスの名前があることに注意してください。







エラー C2259 : '州' : 抽象クラスをインスタンス化できません

これは、このようなエラーが発生したときにコンパイラから受け取る別のメッセージです。



例 # 01:

このエラーを理解しやすくするために、エラーが発生するような方法でコードを記述する例を実行します。そのために、「ShapeClass」という名前のクラスを初期化しました。このクラスを抽象化するために、「getArea」という名前で仮想関数を宣言しました。それぞれ「setWidth」と「setHeight」という名前の 2 つの関数も同様に宣言しました。ここでやりたいことは、高さをパラメータとして取得し、幅を入力パラメータとして取得することです。入力パラメータを使用して面積を計算します。メイン メソッドでクラスのインスタンスを作成しました。そのオブジェクトの助けを借りて、メソッドを呼び出し、そのメソッドを介して入力パラメーターを渡します。その後、出力を印刷して結果を確認しました。



#include

名前空間 std の使用 ;
クラス ShapeClass
{
公衆 :
バーチャル 整数 ゲタリア ( ) = 0 ;
空所 設定幅 ( 整数 )
{
= ;
}
空所 高さを設定 ( 整数 時間 )
{
身長 = 時間 ;
}
保護された :
整数 ;
整数 身長 ;
} ;
整数 主要 ( 空所 )
{
ShapeClasssh ;
sh。 設定幅 ( 1 ) ;
sh。 高さを設定 ( 2 ) ;
カウト << '長方形の総面積: ' << sh。 ゲタリア ( ) << エンドル ;
戻る 0 ;
}

コードの実行後に、システムからエラーが返されました。エラーメッセージは、変数「sh」を抽象型「shapeclass」として宣言できないことを示しています。現在、コンパイラは「ShapeClass」が抽象型であり、その変数を宣言できないことを伝えようとしています。したがって、このメッセージで、コンパイラが抽象クラスのインスタンス化を許可していないことを明確に理解できます。これが、システムがエラーを表示している理由です。





エラーを解決するために、別のクラス「Rectangle」を宣言しました。このクラスは抽象クラスの子クラスになり、このクラスで仮想関数の本体を宣言します。その後、メイン メソッドでそのオブジェクトを作成し、そのオブジェクトを使用して関数を呼び出します。



修正後、コードを作成し、コードの実行に成功しました。システムはエラーなしでコードを実行しました。システムが長方形の面積を計算し、出力を印刷したことを出力で確認できます。私たちの間違いは、間違ったアプローチである抽象クラスのオブジェクトを直接呼び出していたことであることがわかりました。その子クラスのオブジェクトを呼び出すと、コードが正常に動作し始めました。

例 # 02:

この例では、数学的計算は行いません。この例は、抽象クラスと、コードの実行中にコンパイラがメソッドとクラスの間でどのように実行されるかを理解するのに役立つ一般的な例です。このクラスでは、抽象クラスを作成し、「AbsClass」という名前を付けました。別のクラス「ChildClass」を宣言しましたが、これは抽象クラスではありません。このクラスは、抽象クラスから派生しています。

抽象クラスで宣言されたメソッドに「オブジェクトを使用して渡された値」を出力しました。関数の名前は「valueFunc」です。説明したように、仮想関数の本体は子クラスで宣言されます。子クラスでは、仮想関数本体に「In virtual function」と出力しました。ここで、値関数に値を渡し、到達した値が正しいかどうかを確認します。メイン メソッドでは、抽象クラスのインスタンスを作成しました。インスタンスの助けを借りて、仮想関数やその他の関数を呼び出します。次に、コードを実行します。

#include

名前空間 std の使用 ;
クラス AbsClass
{
公衆 :
バーチャル 整数 VirtFunc ( ) = 0 ;
空所 値関数 ( 整数 )
{
= ;
カウト << 「オブジェクトを使用して渡された値」 << << エンドル ;
}
保護された :
整数 ;
} ;
クラス ChildClass :
public AbsClass
{
公衆 :
整数 VirtFunc ( ) {
カウト << 「仮想関数内」 << エンドル ;
}
} ;
整数 主要 ( 空所 )
{
子クラス cc ;
cc。 値関数 ( 5 ) ;
カウト << cc。 VirtFunc ( ) << エンドル ;
戻る 0 ;
}

コードの実行後、エラーが発生します。このエラーは基本的に、ここでメイン メソッドで実行しようとしている抽象クラスをインスタンス化できないことです。ここで注意すべきことの 1 つは、メッセージの変数と抽象型が変更されていることです。

ここで、エラーを削除してコードを実行してみます。そのために、子クラスのオブジェクトを作成し、そのインスタンスを作成します。そのインスタンスの助けを借りて、抽象クラスで仮想メソッドと別のメソッドの両方を呼び出します。子クラスを使用して仮想関数にアクセスできるかどうかも観察されます。これに成功した場合、派生クラスを使用して抽象クラスにアクセスしたと言えます。

コードの実行時に、コンパイラは今回はエラーをスローしませんでした。代わりに、システムはコードを正常にコンパイルし、出力を提供しました。それでは、出力を見てみましょう。システムは、「オブジェクトを使用して渡された値」とそれに対して「5」を出力しました。メイン メソッドでインスタンスを使用して 5 を渡したためです。その後、仮想関数で要求した行を出力しました。

結論

このガイドでは、プログラマーがオブジェクト指向の概念をコーディングおよび実践する際に遭遇する重大なエラーについて説明しました。この種のエラーは、プログラマが抽象クラスを扱っているときによく発生します。記事全体で、抽象クラスはインスタンス化できないこと、およびそれらのオブジェクトにメソッドを呼び出させることはできないことを要約しています。また、さまざまな例を試してエラーを作成し、コード内のエラーを解決しました。