c++ - 读取文件后如何构建不同对象的 vector

标签 c++

各位!我是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/

相关文章:

c++ - boost scoped_ptr/shared_ptr 持有大小与指向的对象大小不同的内存块

c++ - 如何最小化更新一系列收集数据的节点的成本?

c++ - GCC 为 AVR 上的简单 ISR 生成不必要的寄存器推送

c++ - 从 C++ : error 1281 on glUseProgram 使用 openGL ES

c++ - Arduino 串口解析

c++ - 使用 constexpr 而不仅仅是静态 const 变量还能提供什么?

c++ - C++ 构造函数能否知道它是否正在构造一个 const 对象?

c++ - 如何使用迭代器打印一组集合中的内容?

C++:扩展枚举定义?

c++ - unordered_map emplace 编译错误