オブジェクトへのポリモーフィック ポインターが必要boost::ptr_vector
ですが (この部分はほとんど機能しています)、一部の機能に問題があります。
ケーススイッチを使用してロードしptr_vector
て、どの子タイプを指すかを判断したいので、複数のポインターをただ浮かんでいる必要はありませんが、タイプを上書きすると、ポインターはポリモーフィックにそれを指しており、ptr_vector
その中のすべてを上書きします同じポインターを使用してプッシュされました(これは正確なポインターを保存していることに関係していると思います)。これは、ポインターだけでなくオブジェクトのコピー/クローンを与えることで解決できると思いますが、どこにあるのかわかりません、またはこれを行う方法を伝える方法。
私が抱えているもう1つの問題は、ポインターが存在するスコープが終了すると、すべてのオブジェクトが存在しなくなることですptr_vector
(これは問題を修正することで解決できると感じています段落2)
別の質問は、特定のオブジェクトを削除する方法ptr_vector
です。たとえば、オブジェクトに 30 個以上のオブジェクトがある場合、オブジェクト 5 を削除する必要があることがわかりましたptr_vector
(削除するオブジェクトを検索することに注意してください)。 )
編集:私はすでにclone
メソッドを実装しており、それらは正しく機能しています
編集:コード例
#include <iostream>
#include <string>
#include <vector>
#include <boost/ptr_container/ptr_vector.hpp>
gameObject (ポリモーフィック型)
class GameObject {
public :
bool toBeRemoved;
char Type;
int name;
virtual ~GameObject(){}
virtual void updateObject(float duration){}
virtual GameObject * clone(void)const = 0;
};
class Entity : public GameObject{
public:
Entity(int _name){
Type = 'e'; name = _name;
toBeRemoved = false;
}
Entity(const Entity & _o){
toBeRemoved = _o.toBeRemoved;
}
~Entity(){}
void updateObject(float duration){
if(!toBeRemoved){
// perform update work
}
}
Entity * clone(void)const{return new Entity(*this);}
};
class Wall:public GameObject{
public:
bool destroyable;
Wall(bool destroy, int _name){
Type = 'w'; name = _name;
destroyable = destroy;
toBeRemoved = false;
}
Wall(const Wall & _o){
destroyable = _o.destroyable;
}
void updateObject(float duration){
if((duration > 10)&&(destroyable)){
toBeRemoved = true;
}
}
~Wall(){}
Wall * clone(void)const{return new Wall(*this);}
};
object Manager (スコープの例を示すため)
typedef boost::ptr_vector<GameObject*> things; // not sure how to tell this how to clone the objects, or if I have to do it manually
class ObjectMgr{
things objects;
public:
ObjectMgr(){
int entityCount = 0;
int wallCount = 0;
std::vector<std::vector<char>> map;
map.resize(3);
for(int ii = 0; ii <3 ; ii++){map[ii].resize(6);}
for(int ii = 0; ii<6; ii++){map[0][ii] = 'w';}
map[1][0] = 'w'; map[1][1] = 'E';
map[1][2] = '.'; map[1][3] = 'D';
map[1][4] = 'E'; map[1][5] = 'D';
for(int ii = 0; ii<6; ii++){map[2][ii] = 'w';}
GameObject* currentObject;
for(int zz = 0; zz < map.size(); zz++){
for(int xx = 0; xx < map[zz].size(); xx++){
switch(map[zz][xx]){
case 'w': // undestroyable wall
currentObject = new Wall(false,wallCount++);
objects.push_back(¤tObject);
break;
case 'E': // entity
currentObject = new Entity(entityCount++);
objects.push_back(¤tObject);
break;
case 'D': // destroyable wall
currentObject = new Wall(true,wallCount++);
objects.push_back(¤tObject);
break;
case '.': // empty space
break;
}
}
}
print();
}
void clean(){ // thinking that might need to do some kind of swapping, and then maybe pop_back()
bool removed;
do{
removed = false;
things::iterator ii = objects.begin();
// for(int jj = 0; ii != objects.end(); ii++, jj++){
// if(objects[jj]->toBeRemoved == true){
// removed = true;
// // remove item here
// break;
// }
// }
} while(removed);
}
void print(){
int count = 0;
things::iterator reg = objects.begin();
std::cout << "entities" << std::endl << "===================" << std::endl;
for(int ii = 0; reg!=objects.end(); ii++, reg++){
std::cout << count++ << ": " << objects[ii]->Type << objects[ii]->name << " " << std::endl;
}
std::cout << "====================" << std::endl << "/entities" << std::endl;
}
};
主要
int _tmain(int argc, _TCHAR* argv[]){
ObjectMgr manager;
std::cout << "constructed now displaying" << std::endl;
manager.print();
std::cout << "cleaning" << std::endl;
// manager.clean();
std:: cout << "displaying after cleaning" << std::endl;
// manager.print();
return 0;
}