C++ 我的框架:未知子类的集合(热点)

C++ 我的框架:未知子类的集合(热点),c++,templates,vector,collections,subclass,C++,Templates,Vector,Collections,Subclass,我有一个奇怪的问题,我想有一个类脚本的子类集合。但问题是我不知道这些子类的类型,因为它们是由另一个人编程的(这是我的框架的一个热点)。所以我使用了一个模板函数,但这不是我的强项,它给了我一个未解析的外部符号。 我甚至不知道如何在SO中搜索其他问题。 下面是尝试将脚本子类添加到脚本向量的代码: template <class T> T* GameObject::addComponent() { T *t = new T(this); Script *s = dynami

我有一个奇怪的问题,我想有一个类脚本的子类集合。但问题是我不知道这些子类的类型,因为它们是由另一个人编程的(这是我的框架的一个热点)。所以我使用了一个模板函数,但这不是我的强项,它给了我一个未解析的外部符号。 我甚至不知道如何在SO中搜索其他问题。 下面是尝试将脚本子类添加到脚本向量的代码:

template <class T>
T* GameObject::addComponent()
{
    T *t = new T(this);
    Script *s = dynamic_cast<Script*> (&t);
    if (s)
    {
        scripts.push_back(t);
        return t;
    }
    return nullptr; 
}
模板
T*GameObject::addComponent()
{
T*T=新的T(本);
脚本*s=动态_转换(&t);
若有(s)
{
脚本。推回(t);
返回t;
}
返回空ptr;
}
它被转换为脚本,以防止其他类型的对象被此通用函数捕获。 这就是所谓的:

Cube->addComponent<myScript>();
cube->addComponent(new MyScript);
Cube->addComponent();
其中myScript是脚本的子类。
如果我正在编写可怕的代码,请纠正我

如果我没弄错的话,那么对于
MyScript
,您有类似的东西:

class MyScript : public Script
{
    ...
};
GameObject::addComponent(Script * s)
{
    scripts.push_back(t);
}
然后,
GameObj
就可以接收指向
脚本的指针了:

class MyScript : public Script
{
    ...
};
GameObject::addComponent(Script * s)
{
    scripts.push_back(t);
}
你会这样称呼它:

Cube->addComponent<myScript>();
cube->addComponent(new MyScript);

除了你的问题之外,如果动态_cast失败,你正在泄漏
t
。是的,但问题是我正在维护模板函数的使用,例如用addComponent()调用它,当我知道GameObject中的类型时,它会工作,但在这种情况下我不知道。也许我想保持模板的这种用法是错误的?(很抱歉回复太晚…)是的,据我所知,你根本不需要模板来做你想做的事情。简单的旧继承就足够了。