各位!我是C++的新手,现在在做一个C++项目。整个结构已经完成。但是我一直想知道
如何构建不同对象的vector以及如何从一开始就读取文件。
在我的问题中,首先我必须读取一个具有以下格式的 readObstacles(std::istream &fs) 的 txt 文件:
RECTANGLE 1 2.5 2 2 0.2
CIRCLE 1 2.5 1.2
RECTANGLE 4 2 2 2 0.3
(每个障碍开始一个新行)
我需要读取不同障碍物的数据信息,并将这些障碍物存储在一个 vector 中。
Obstacle类是基类,有两个子类CIRCLE和RECTANGLE。
我尝试将这些不同的障碍物(我认为应该有它们的数据信息)放在一个障碍物 vector 中,然后调用它们都有的虚函数。
下面是我尝试使用的代码:
vector<Obstacle> obsdata;
Myworld::readObstacles(std::istream &fs)
{
std::string shape;
double num1,num2,num3,num4,num5;
while(fs>>shape>>num1>>num2>>num3>>num4>>num5)
{
if(shape=="CIRCLE") {
CIRCLE c;
c.m_Xc=num1;
c.m_Yc=num2;
c.m_Radius=num3;
obsdata.push_back(c);
}
if(shape=="RECTANGLE") {
RECTANGLE r;
r.center_x=num1;
r.center_y=num2;
r.width=num3;
r.height=num4;
r.angle=num5;
obsdata.push_back(r);
}
}
}
MyWorld::writeMatlabDisplayCode(std::ostream &fs)
{
for( i = 0; i < obsdata.size(); i++ )
obsdata[i].writeMatlabDisplayCode(fs);
}
我知道这行不通,但我不知道我应该做什么。
任何言语都会有所帮助。谢谢!
最佳答案
你有一个叫做切片的问题:如果你复制到一个包含基类实例的 vector ,你会丢失派生类的数据。
不过,您可以使用指向基址的指针 vector :
std::vector<Obstacle*> obsdata;
RECTANGLE r = new RECTANGLE;
// set properties
obsdata.push_back(r);
// use it later, e.g.:
obsdata[0]->writeMatlabDisplayCode(fs);
// clean up when you don't need obstacles anymore:
for(std::vector<Obstacle*>::iterator it = obsdata.begin(); it != obsdata.end(); ++it)
delete *it;
您还应该避免每次尝试读入 5 个数字。相反,您可以阅读障碍物描述,然后根据特定障碍物的需要阅读尽可能多的数字。
关于c++ - 读取文件后如何构建不同对象的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1691491/