我有一个球员课,包括:

typedef string cptype;
map <cptype, unique_ptr<Cp> > Cps;

我添加了一个指向此 map 的指针:
Cps.insert(make_pair("Pos", unique_ptr<Cp>(new PosCp())));

现在,当我尝试使用此命令访问PosCp的pos成员变量时:
Cps["Pos"]->pos = sf::Vector2f(0, 0);

我得到错误:
class Cp has no member pos

当我尝试使用dynamic_cast时,具有以下内容:
dynamic_cast<PosCp*>(Cps["Pos"])->pos = sf::Vector2f(0, 0);

我得到错误:
cannot dynamic_cast [this object]

(理所当然的,我不想更改指针,我只想访问成员变量)

如何在不更改 map 中指针类型的情况下访问pos成员?

这是CpPosCp类:
class Cp
{
    public:
        Cp();
        virtual ~Cp();

        cptype type;
};
class PosCp : public Cp
{
    public:
        PosCp();
        ~PosCp();

        sf::Vector2f pos;
};

最佳答案

您可以尝试以下方法:

if (PosCp * p = dynamic_cast<PosCp *>(Cps["Pos"].get()))
{
    p->pos = sf::Vector2f(0, 0);
}
else
{
    // most-derived type of *Cps["Pos"] is not PosCp
}

10-04 10:38