1

オブジェクトへのポリモーフィック ポインターが必要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(&currentObject);
                    break;
                case 'E':   // entity
                    currentObject = new Entity(entityCount++);
                    objects.push_back(&currentObject);
                    break;
                case 'D':   // destroyable wall
                    currentObject = new Wall(true,wallCount++);
                    objects.push_back(&currentObject);
                    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;
}
4

0 に答える 0