gpt4 book ai didi

c++ - 指向抽象类的指针 vector ,用于访问派生类成员

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:13:17 25 4
gpt4 key购买 nike


我是 C++ 的新手,正在尝试实现一个 turtle 模拟器,它将从文本文件中读取命令,将它们放在一个 vector 上并使用 glut
绘制它们我有节点类、从节点派生的命令类、来自命令的 4 个派生类(forward、left、right、jump、repeat)和用于存储命令的 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);
};

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

还有关于我声明的 friend 函数的一些事情,我不确定它是否正确:我在 Prog 类上定义了 friend istream& operator>> (istream& in, Prog& pro); 并在其他 2 个类中声明了它,或者我需要为每个类定义它并且在中有不同的第二个参数每节课??
提前致谢:)

最佳答案

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

此外,函数或类必须在每个类中声明为友元,因为它会访问非私有(private)成员。

关于c++ - 指向抽象类的指针 vector ,用于访问派生类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4419104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com