I have a lot of types derivating from Component and I store a pointer to them in my map. But when I try to get a Component from the map and cast it to a specific type to use it, I get the compile error above. I don't understand why.
機能が間違ってコーディングされているためです。
あなたの関数はオブジェクト(ない完全な派生型)のちょうどComponent
部分にアクセスするためのポインタを参照解除、マップからComponent*
ポインタを取得し、その後、派生クラスの一時的インスタンスを構築しようとしていますComponent
を入力します。言い換えれば
、あなたの例では、基本的にこれをやっている:
inline Color& getObject(const std::string& key)
{
TComponent *pcomp = _map.at(key);
Color tmp(*pcomp); // <-- error here
return tmp;
}
エラーがColor
クラスが入力としてComponent
を受け取るコンストラクタを持っていないので、それはコンパイルに失敗したことを意味します。
参照を、関数の終了時に破棄される一時オブジェクトに返すので、コードがコンパイルされたとしても、間違っている可能性があります。そのため、呼び出し元は無効なメモリ。
@MikeVineコメントで述べたように、あなたはそれを修正するために、このような関数を書くことができます:
template<typename U>
inline U& getObject(const std::string& key)
{
return static_cast<U&>(*(_map.at(key)));
}
そして、それが働くだろう、それは一時的なオブジェクトの構築を排除し、への参照を返すよう既存のオブジェクトはマップに格納されます。あなたはまた、代わりにこのような関数を書くことができ
:
template <typename U>
inline U& getObject(const std::string& key)
{
return *(static_cast<U*>(_map.at(key)));
}
このコードは、派生クラスのオブジェクトにアクセスするには、それを逆参照する前に、まずU*
ポインタにComponent*
ポインタをキャストします。
あなたは要求されたコンポーネントが実際に要求されたタイプであるかどうかを実行時にわからない場合、あなたはそれを返す前に確認するために、ハンドリングいくつかの余分なエラーを追加することができます。また
template <typename U>
inline U& getObject(const std::string& key)
{
U *ptr = dynamic_cast<U*>(_map.at(key));
if (!ptr) throw std::invalid_argument("");
return *ptr;
}
:
template<typename U>
inline U& getObject(const std::string& key)
{
return dynamic_cast<U&>(*(_map.at(key)));
}
静かにキャストしてU& –
うんざりしました。うんざりしているとは信じられませんが、verryに感謝しています。睡眠が得られるはずです。 – Roger
@Redleouf、それは誤植ですか?あなたがqを掲示したときの可能な答えうつ病? –