2016-04-08 3 views
0

私はこれらのオブジェクトを "MyGroup"と呼びます。 MyGroupサブクラスBaseGroup。リアルタイムシステムであるため、動的メモリ割り当ての贅沢さはありません。そのため、特定の種類のオブジェクトを一定数割り当てるオブジェクトObjectPoolがあります。この場合、私は10 MyGroupオブジェクトが割り当てられていると言います。"テンプレートベースの識別子Xを解決できません" - テンプレートクラス(C++)からテンプレートパラメータクラスのメソッドを呼び出します

今、これらのグループをKey-Valueマップに保存します。そこで私はFiniteMapテンプレートクラスを作成して、指定されたタイプのオブジェクトを格納できる、指定されたサイズのジェネリックマップを作成しました。

マイGroupListクラスのサブクラスFiniteMap、私は私が私のGroupListをして保存したいBaseGroupのどのサブクラスかわからないので、まだ、パラメータ<G, S>できます。

BaseGroup::createGroup()のメソッドは純粋な仮想ですので、MyGroupに実装されています。

そう - 問題は、// ***でマークされた行に、私は、コンパイル、次の2つのいずれかを取得していている:いずれかの警告:Unable to resolve template based identifier createGroup、または私は実際にgetOrCreateGroup()方法、エラー呼び出す場合:cannot call member function 'virtual MyGroup* MyGroup::createGroup(unsigned int) without objectを。

GroupListをオブジェクトがメインロジックでインスタンス化されています

GroupList<MyGroup, 10> myGroupList; 

任意のアイデア?

私はこれらのテンプレートクラスを持っている:

template <class T, unsigned int S> 
class FiniteMap 
{ 
    // class to implement an array of these types of structures. 
    // Contains methods for put, remove, get, etc. 
    struct Entry 
    { 
     int key; 
     T* pObject; 
     bool inUse; 
     Entry() : key(0), pObject(NULL), inUse(false) {} 
    } 
} 

template <class G, unsigned int S> 
class GroupList : public FiniteMap<G, S> 
{ 
    // ... 
    G* getOrCreateGroup(unsigned int groupNumber) 
    { 
     G* pGroup = this->get(groupNumber); 
     if (pGroup == NULL) 
     { 
      pGroup = G::createGroup(groupNumber); // *** 
      if (pGroup == NULL) 
      { 
      // handle error 
      } 
     } 
     return pGroup; 
    } 
} 

class BaseGroup 
{ 
public: 
    virtual BaseGroup* createGroup(unsigned int groupNumber) = 0; 

protected: 
    unsigned int _groupNumber; 
} 

class MyGroup : BaseGroup 
{ 
public: 
    virtual MyGroup* createGroup(unsigned int groupNumber) 
    { 
     MyGroup* g = MyGroupPool.New(); // Object pool allocation 
     if (g == NULL) 
     { 
      // handle error 
     } 
     else 
     { 
      g->_groupNumber = groupNumber; 
     } 
     return g; 
    } 
} 
+0

ありがとうございました。 – livefree75

+0

'GroupList'クラス定義を次のように変更して部分的に修正しました: ' template class GroupList:public FiniteMap '、' G'を 'BaseGroup'に変更'GroupList'。 しかし、私は、オブジェクトなしで 'createGroup() 'を呼び出すことができなくなってきています。しかし、 'getOrCreateGroup'で作成したい' BaseGroup'のサブクラスは分かりません。 – livefree75

答えて

1

createGroupが静的​​ではないではありませんどちらもあなたがGから継承されているので、あなたが

G::createGroup(); 

を呼び出すことはできません。

createGroupを静的にすることを意味しましたか? (これも非仮想的な)これがなぜ仮想的なのかは明らかではありません。

+0

'BaseGroup'の異なるサブクラスを作成できるようにしたいので、それぞれ独自のオブジェクトプールアロケータを使用する必要があるので、仮想です。したがって、 'createGroup'を仮想にし、各サブクラスにそれを定義させる必要があります。 私はそれを静的にしたいと思っていますが、それを仮想静的にしようとするとエラーが発生します。 – livefree75

+0

'GroupList'クラスは私のメインロジックでインスタンス化されています: ' GroupList myGroupList; – livefree75

+0

これは 'myGroup'のインスタンスがなくても' myGroupObject - > createGroup(...) 'を実行します。 'createGroup'はどのメンバーにも依存しないので、あなたは仮想ではなく静的にする必要があります – vu1p3n0x

0

これは私がどのように問題を解決したかです。それができるかどうかは分かりません。

基本的にGroupListcreateGroupの純粋仮想メソッドを作成し、MyGroupオブジェクトの作成を処理する新しいMyGroupListクラスを作成しました。

template <class T, unsigned int S> 
class FiniteMap 
{ 
    // class to implement an array of these types of structures. 
    // Contains methods for put, remove, get, etc. 
    struct Entry 
    { 
     int key; 
     T* pObject; 
     bool inUse; 
     Entry() : key(0), pObject(NULL), inUse(false) {} 
    } 
} 

template <class G, unsigned int S> 
class GroupList : public FiniteMap<G, S> 
{ 
    // ... 
    G* getOrCreateGroup(unsigned int groupNumber) 
    { 
     G* pGroup = this->get(groupNumber); 
     if (pGroup == NULL) 
     { 
      pGroup = G::createGroup(groupNumber); // *** 
      if (pGroup == NULL) 
      { 
      // handle error 
      } 
     } 
     return pGroup; 
    } 

private: 
    virtual G* createGroup(unsigned int groupNumber) = 0; 
} 

template <unsigned int S> 
class MyGroupList : public GroupList<MyGroup, S> 
{ 
public: 
    virtual MyGroup* createGroup(unsigned int groupNumber) 
    { 
     MyGroup* g = MyGroupPool.New(); 
     return g; // may be NULL if unable to allocate 
    } 
} 


class BaseGroup 
{ 
public: 
    // stuff 

protected: 
    unsigned int _groupNumber; 
} 

class MyGroup : BaseGroup 
{ 
public: 
    // some other stuff 
} 
関連する問題