【问题标题】:Vector of pointers to abstract class,to access derived class members指向抽象类的指针向量,用于访问派生类成员
【发布时间】:2011-05-24 01:50:38
【问题描述】:


我是 C++ 新手,正在尝试实现一个海龟模拟器,该模拟器将从文本文件中读取命令,将它们放在矢量上并使用 glut
我有节点类、从节点派生的命令类、来自命令的 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);
};

现在我们能够从文件中读取并在临时向量中写入命令,然后是它们的值。例如,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&amp; operator&gt;&gt; (istream&amp; in, Prog&amp; pro); 并在其他 2 个类中声明了它,或者我需要为每个类定义它并在每个类中有不同的第二个参数??
在此先感谢:)

【问题讨论】:

    标签: c++ class pointers vector polymorphism


    【解决方案1】:

    根据您的描述,pro.push_back( new Forward(value) ); 就是您要查找的内容。

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

    【讨论】:

    • with pro.push_back(new Forward(value));我会有一个指向用值创建的对象的指针,还是插入向量中的实际对象?
    • 这段代码只创建一个对象(用值创建),所以向量中的指针将指向那个对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 2013-01-27
    • 2017-12-27
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多