基本抽象クラス (エンティティ) へのポインターのリストがあります。
std::list<Entity*> m_entities;
このクラスを反復処理するための typedef を作成しました
typedef std::list<Entity*>::const_iterator entityIter;
次に、リスト内の各ポインターを反復処理します
for (entityIter i = m_entities.begin(); i != m_entities.end(); ++i)
{
const Entity &e = *i; // ERROR
e.DoStuff();
}
各ポインタを参照しようとすると、次のエラーが発生します
IntelliSense: "Entity *const" から "Entity" に変換するための適切なコンストラクターが存在しません
私は間違って何をしましたか?
編集:
std::shared_ptr を使用しようとしました
std::list<std::shared_ptr<Entity>> m_entities;
この方法でリストに追加することはできませんが
Entity::Entity(Game *game)
: m_game(game)
{
m_game->g_idGenerator->generateNewID();
m_game->m_entities.push_back(this); // ERROR
}
以下を使用して
m_game->m_entities.push_back(std::shared_ptr<Entity>(this));
このエラーが表示されます
エラー C2664: 'void std::list<_Ty>::push_back(_Ty &&)': パラメーター 1 を >'Entity' から 'std::tr1::shared_ptr<_Ty> &&' に変換できません
編集2:
現在のコードのまとめ
for (entityIter i = m_entities.begin(); i != m_entities.end(); ++i)
{
// *i dereferences the iterator and returns an Entity*
// **i would additionally deference the pointer
// Adding 'const' infront of Entity means that I can't alter the Entity
Entity &e = **i;
e.draw(dt); // Causes access violation error with standard pointers
}
上記のコードによって引き起こされるエラーを回避するかどうかを確認するために、 std:shared_ptr への変換を試みました。
ただし、エンティティを std::shared_ptr のリストに追加する際に問題が発生しています
m_game->m_entities.push_back(std::shared_ptr<Entity>(this));
要約すると、標準ポインターでアクセス違反エラーが発生し、shared_ptr でリストに追加できません。
リストへの入力は、基本エンティティ クラスのコンストラクターを介して行われます。
Entity::Entity(Game *game)
: m_game(game)
{
m_game->g_idGenerator->generateNewID();
// shared_ptr version
m_game->m_entities.push_back(std::shared_ptr<Entity>(this)); // ERROR C2664
// raw pointer version
//m_game->m_entities.push_back(this); // ACCESS VIOLATION ERROR when calling methods
}