1

私は C++ での概念の問題で立ち往生しています:

std::list とほとんど同じですが、オブジェクトのみを格納し、新しい配置を持つコンストラクターと格納されたオブジェクトのデストラクターを呼び出します。

次に、getObjectWithClass テンプレート メソッドを持つ ObjectAllocator クラスを作成しました。ObjectAllocator と Pool テンプレート クラスの間のブリッジとして機能する PoolObjectAllocator サブクラスを持つことができるように、このクラスをインターフェイスのようにしたいと考えています。

ただし、これはテンプレート メソッドであるため、getObjectWithClass を仮想として作成する方法はありません。

template <class T>
class Pool {
  ...
public:
  T& getFreeObject();
  ...
}

class ObjectAllocator {
public:
  template <class T> T* getObjectWithClass(); // I need this method to be virtual
};

class PoolObjectAllocator : public ObjectAllocator {
  std::map<int, void *> pools;

public:
  template <class T> T* getObjectWithClass() {
    int type = T::GetType();

    Pool<T> *pool;
    if (this->pools.find(type) == this->pools.end()) {
      pool = new Pool<T>();
      pools[type] = pool;
    } else {
      pool = static_cast<Pool<T> *>(pools[type]);
    }

    return &pool->getFreeObject();
  };
};

// Later in the program :
ObjectAllocator *objectAllocator = myObject.getObjectAllocator();
objectAllocator->getObjectWithClass<OneClass>();

// Because the above line call a non virtual method, the method called is ObjectAllocator::getObjectAllocator and not PoolObjectAllocator::getObjectAllocator even if the objectAllocator is a PoolObjectAllocator.

これを機能させる方法が見つかりません。誰かが私を助けてくれますか? ありがとう

4

0 に答える 0