指向抽象类的指针向量,访问派生类成员

时间:2010-12-11 21:42:25

标签: c++ class pointers vector polymorphism


我是C ++的新手并试图实现一个乌龟模拟器,它将从文本文件中读取命令,将它们放在矢量上并使用过滤来绘制它们 我有节点类,从节点派生的命令类,4个派生类(前进,左,右,跳,重复)来自命令和Prog类,用于存储命令。

class node
{
    public:
        node();
        virtual ~node();
        virtual void Run()=0;
};

class command : public node
{
    private:
        float v;
    public:
        command();
        command(float);
        ~command();
        virtual void Run();
        friend istream& Prog::operator>> (istream& in, Prog& pro);
};

class Repeat : public command
{
    private:
        Prog pg;
    public:
        Repeat(float value, istream& in);
        ~Repeat();
        void Run();
        friend istream& Prog::operator>> (istream& in, Prog& pro);
};

class Prog
{
    private:
        vector<node*> listing;
    public:
        Prog();
        ~Prog();
        void Run();
        friend istream& operator>> (istream& in, Prog& pro);
};

现在我们可以从文件中读取并在temp矢量中写入命令,然后是它们的值。例如,repeat应该重复以下命令的4倍 |重复| 4 |转发| 4 |左| 40 |转发| 10个
我们想在Prog类指针中添加列表向量到基类对象,这将用于调用4个派生类的Run函数并利用多态性
我的问题是我用一段时间来浏览我的临时向量,并为我找到的每个命令创建一个对象,但我只能使用相同的名称,因为动态命名不能使用(我认为)而且我认为每个新的转发命令将覆盖fw对象

    else if (command=="FORWARD")
    {
        Forward::Forward fw(value);
        node* ptr;
        ptr= &fw;
        pro.push_back(ptr);
        text.erase (text.begin(), text.begin()+2);*/
    }

我尝试使用类似下面的内容但找不到正确的方法

    else if (command=="FORWARD")
    {
        Forward::Forward fw(value);
        new Forward(fw);
        node* ptr;
        ptr= &(??);
        pro.push_back(ptr);
        text.erase (text.begin(), text.begin()+2);*/

}

有没有办法做我想要的?最后我们要调用Prog :: Run 看起来像这样

void Prog::Run()
{
        vector<node*>::iterator it;
        for (it=listing.begin();it!=listing.end();it++)
        listing[it]->Run();
}

还有一些我已宣布的朋友功能,我不会放弃确定它是否正确: 我在Prog类上定义了friend istream& operator>> (istream& in, Prog& pro);并在其他2个类中声明了它,或者我需要为每个类定义它并在每个类中有不同的第二个参数? 提前谢谢:)

1 个答案:

答案 0 :(得分:2)

根据您的描述,pro.push_back( new Forward(value) );正是您所寻找的。

此外,函数或类必须在每个将被非私有成员访问的类中声明为朋友。