я могу передать объектный класс, который унаследован от шаблонного класса?

0

Как я могу передать объект, унаследованный от шаблона, так как это функция

см. конструктор GameObj :: GameObj, я пытаюсь передать GameObj, наследующий шаблон BaseGameObject, но его недействительно

template<typename T>
class BaseGameObject 
{
    public:
        BaseGameObject(){};

        virtual ~BaseGameObject(){};

        static T* create(IImageComponent* imageComponent)
        {

        }
    protected:
        IImageComponent* m_IImageComponent;
};
class GameObj :public BaseGameObject<GameObj>  
{
    public:
        GameObj(IImageComponent* imageComponent);
        virtual ~GameObj(){};



};

GameObj::GameObj(IImageComponent* imageComponent):m_IImageComponent(imageComponent)
{

    m_IImageComponent->update(*this); //HERE IS THE PROBLEM IT ASK ME TO PASS TAMPLATE 
}
class GameObjImageCompnent
{
public :
    GameObjImageCompnent(const std::string &spritefilename);
    virtual void update(BaseGameObject& baseGameObject);


private:
    std::string m_spritefilename;
};

GameObjImageCompnent::GameObjImageCompnent(const std::string &spritefilename):
    m_spritefilename(spritefilename)
{
    ;
}
void GameObjImageCompnent::update(BaseGameObject& baseGameObject)
{

    baseGameObject.setInitWithSpriteFrameName(m_spritefilename);
}

эта ссылка не работает для меня: передача классов шаблонов в качестве аргументов методам

  • 0
    как выглядит класс IImageComponent, особенно сигнатура метода update ()?
  • 0
    его простой абстрактный класс, с обновлением как чисто виртуальным, но я не знаю, что я должен установить в args, так как он не работает
Показать ещё 2 комментария
Теги:
templates

1 ответ

1
Лучший ответ

BaseGameObject - это шаблон. GameObjImageCompnent::update имеет объявление virtual void update(BaseGameObject& baseGameObject); , Это неправильно, потому что BaseGameObject - это не тип, а шаблон.

Возможно, вы должны изменить это объявление на: virtual void update(BaseGameObject<GameObj>& baseGameObject);

Если вам нужно иметь возможность вызывать это с помощью разных BaseGameObject s, вы можете сделать GameObjImageCompnent в шаблоне:

template<class T>
class GameObjImageCompnent {
// ...
virtual void update(BaseGameObject<T>& baseGameObject);

Если это не вариант, вам, вероятно, необходимо наследовать BaseGameObject из базового класса без шаблона и использовать его в качестве ссылочного типа. Если базовый класс для BaseGameObject не является вариантом, вам нужно переосмыслить свой дизайн.

class IGameObject {
public:
    virtual ~IGameObject() {}
    // any other virtual functions that are needed
};

template<typename T>
class BaseGameObject: public IGameObject {
//...

class GameObjImageCompnent {
// ...
virtual void update(IGameObject& baseGameObject);

Кажется, вы используете CRTP. См. Раздел "Ловушки":

Одна проблема со статическим полиморфизмом заключается в том, что без использования общего базового класса, такого как "Shape" из приведенного выше примера, вы не можете хранить свои производные классы гетерогенно, так как каждый базовый класс CRTP является уникальным типом. По этой причине, вероятно, вы захотите наследовать из общего базового класса с виртуальным деструктором, как в примере выше.

Я думаю, что это ограничение также относится к передаче объектов производных классов функции через гетерогенную ссылку.

  • 0
    BaseGameObject - это шаблон. BaseGameObject<T> является типом. BaseGameObject не является типом, неполным или иным образом.
  • 0
    Спасибо, мои условия были неправильными. Я исправил это.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню