[解決済み] std::vector<AbstractClass> の宣言ができないのはなぜか?
2022-12-08 09:48:20
質問
C# での開発にかなりの時間を費やした結果、インターフェースとして使用する目的で抽象クラスを宣言した場合、子クラスのインスタンスを格納するためにこの抽象クラスのベクトルをインスタンス化することができないことに気づきました。
#pragma once
#include <iostream>
#include <vector>
using namespace std;
class IFunnyInterface
{
public:
virtual void IamFunny() = 0;
};
class FunnyImpl: IFunnyInterface
{
public:
virtual void IamFunny()
{
cout << "<INSERT JOKE HERE>";
}
};
class FunnyContainer
{
private:
std::vector <IFunnyInterface> funnyItems;
};
抽象クラスのvectorを宣言している行は、MS VS2005でこのエラーを引き起こします。
error C2259: 'IFunnyInterface' : cannot instantiate abstract class
明らかな回避策が見えます。それは、IFunnyInterfaceを次のように置き換えることです。
class IFunnyInterface
{
public:
virtual void IamFunny()
{
throw new std::exception("not implemented");
}
};
これはC++的に許容できる回避策なのでしょうか? もしそうでなければ、これを回避するのに役立つ boost のようなサードパーティライブラリはありますか?
お読みいただきありがとうございます。
アンソニー
どのように解決するのですか?
抽象クラスはインスタンス化できないので、抽象クラスのベクターは機能しない。
しかし、抽象クラスへのポインタのベクトルを使用することができます。
std::vector<IFunnyInterface*> ifVec;
これはまた、実際にポリモーフィックな振る舞いを使うこともできます。たとえクラスが抽象的でなかったとしても、値によって保存することは、以下の問題につながります。 オブジェクトのスライス .
関連
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] switch文の中で変数を宣言してはいけないのはなぜですか?
-
[解決済み] C++でインターフェイスを宣言するには?
-
[解決済み] std::vectorをハードコードされた要素で初期化する最も簡単な方法は何ですか?
-
[解決済み] std::vector<> からインデックスで要素を消すにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる