我是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);
};
现在我们能够读取文件并在临时向量中写入命令,然后是它们的值.例如,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();
}
还有一些我已宣布的朋友功能,我不会放弃确定它是否正确:
我定义了朋友istream&操作符GT;> (istream& in,Prog& pro);在Prog类上,只是在其他2个类中声明它,或者我需要为每个类定义它,并在每个类中有不同的第二个参数?
提前致谢:)
最佳答案 根据你描述的内容,pro.push_back(new Forward(value));是你在找什么.
此外,必须在每个将要访问非私有成员的类中将函数或类声明为朋友.