私はライブラリを書いていますが、その中にクラス BaseClass があります。ライブラリを使用する人は誰でも、BaseClass から継承する独自のクラスを作成します。別のクラスがあります。それを Manager と呼びましょう。これは BaseClass ポインターのベクトルを保持し、BaseClass から派生した任意のオブジェクトを保持できます。
Manager クラスは、その BaseClass ベクターに追加されたオブジェクトの作成と破棄を処理する必要があります。これは、ベクトル内の任意のオブジェクトをいつでも削除でき、マネージャー自体も削除できるためです。このため、ライブラリのユーザーは、BaseClass から派生した既存のオブジェクトへのポインタを渡すことによって Manager の baseClass ベクトルにオブジェクトを追加することはできません。実際には、ユーザーにそれを許可することができました。しかし、それにはダミー オブジェクトをコピーする必要があり、私はそうしたくありません。
これを解決するために、テンプレート関数を使用しようとしています。ユーザーは、BaseClass から派生したオブジェクトを Manager のベクターに追加しようとするときに、オブジェクトの型を渡す必要があります。これは私が現在持っているものです。
//Manager.h
#include <vector>
#include "BaseClass.h"
#include <typeinfo>
class Manager {
//Vector holding pointers to any objects inherited from BaseClass
vector<BaseClass*> baseClasses;
//Template function that needs to add NEW object to baseClass vector
//This I'm having problems with
template<class T>
BaseClass* Add() {
BaseClass* baseClass = new T();
baseClasses.push_back(baseClass);
return baseClass;
}
//Template function that gets object from baseClass vector
//This works fine
template<class T>
BaseClass* Get() {
for (int i = 0; i < baseClasses.size(); i++) {
if (typeid(*baseClasses[i]) == typeid(T)) {
return baseClasses[i];
}
}
return NULL;
}
};
たとえば、ユーザーは Manager の baseClass ベクターにオブジェクトを追加または取得するときにこれを行う必要があります。DerivedClass は BaseClass から派生します
Manager manager;
//Add a new DerivedClass object to Manager's vector
manager.Add<DerivedClass>();
//Get a pointer to the DerivedClass object that was just added
DerivedClass* derivedClass = (DerivedClass*)manager.Get<DerivedClass>();
私の Get() 関数は正常に動作します。私が知る必要があるのは、Add() 関数を機能させるにはどうすればよいかということです。助けていただければ幸いです。