2016-07-06 20 views
1

Systemクラスを継承するMovementSystemクラスがあります。私はxxxSystemのインスタンスを格納しますので、その後、私はxxxSystemクラスの数を持っていますマップにこの方法(システムごとにインスタンスが1つしかない):私は私のクラスを必要とするのでC++多態性 - 継承クラスのマップ

enum 
{ 
    MOVEMENT_SYSTEM 
}; 

std::map<int,std::unique_ptr<System>> systems; 
systems[MOVEMENT_SYSTEM] = std::unique_ptr<System>(new MovementSystem()); 

m_entityManager.loadSystems(&systems); 

最後の行があるEntityManagerすべてのシステムにアクセスできます。

そこで私はこの方法があります:私は、私はクラスにこの方法を送ったシステムにアクセスしようEntityManagerの他の方法で

std::map<int,std::unique_ptr<System>> *m_systems; // this line is in the header 

void EntityManager::loadSystems(std::map<int,std::unique_ptr<System>> *systems) 
{ 
    m_systems = systems; 
} 

そして最後に:

std::unique_ptr<MovementSystem> mvt = (*m_systems)[MOVEMENT_SYSTEM]; 
mvt->update(dt); 

をしかし、私は取得このエラー:

conversion from 'std::map<int, std::unique_ptr<System> >::mapped_type {aka std::unique_ptr<System>}' to non-scalar type 'std::unique_ptr<MovementSystem>' requested 

どのように私はこれを修正し、最後の行を呼び出すことができます更新方法はMovementSystem

+0

表現 '* m_systemsを[ MOVEMENT_SYSTEM] 'はあなたが思っていることをしません。 [演算子の優先順位](http://en.cppreference.com/w/cpp/language/operator_precedence)のため、 'm_systems'がポインタであるため動作しない' *(m_systems [MOVEMENT_SYSTEM]) 'として翻訳されています。 '(* m_systems)[MOVEMENT_SYSTEM]'を使う必要があります。 –

+0

私はそれをしましたが、エラーはまったく同じです。 – Urefeu

+0

接線関係:1.マップへのポインタを持つのはおそらく間違いです。 2.デザイン全体が疑わしいように見えます。基本的にシングルトンを格納するマップが必要なのはなぜですか? –

答えて

0
std::unique_ptr<MovementSystem> mvt = *m_systems[MOVEMENT_SYSTEM]; 

この行には2つの問題があります。一つは、演算子の優先順位は、それがこのように解釈し得るようなものである:

*(m_systems[MOVEMENT_SYSTEM]) 

これは、ポインタm_systemsポインタ演算を適用する手段(「アレイ」にMOVEMENT-SYSTEM番目の要素にアクセスm_systemsによって指されます)そのマップに*を適用します。これはナンセンスです。あなたが望んだのはこれでした:

(*m_systems)[MOVEMENT_SYSTEM] 

2番目の問題は、一意のポインタをコピーしようとしていることです。正確には、ユニークなポインタが防止するために設計されているものです。

あなたはおそらく、単にポインタを取得し、それに応じてキャストされたい:それは不必要なポインタを取り除くため

MovementSystem *mvt = static_cast<MovementSystem*>((*m_systems)[MOVEMENT_SYSTEM].get()); 

または、さらに良いの:

auto &systems = *m_systems; 
auto &mvt = static_cast<MovementSystem&>(*systems[MOVEMENT_SYSTEM]); 
mvt.update(dt); 
+0

あなたの答えをありがとう。最初の問題は修正されています。もう1つは、もうエラーは表示されませんが、プログラムがクラッシュします。3行前の 'cout'が表示されますが、MovementSystem :: update()の先頭のものは表示されません。私はもう1つの 'cout'を入れて、' static_cast'の行でクラッシュすることが判明しました。 – Urefeu

+0

@Urefeu別のアプローチが必要です(すべてのことを想定してデバッグする必要があります)、潜在的に異なる[mcve]などです。私の 'static_cast'の代わりにチェックされた' dynamic_cast'などを使用してプログラムを実行してみてください。あなたがまだ立ち往生している場合は、あなたの発見とMCVEを新しい質問として投稿してください。 – Angew