将参数添加到该类别一个向量中包含的类中

Add a parameter to a class contained in one vector of that class

本文关键字:一个 向量 包含 添加 参数      更新时间:2023-10-16

我正在做战舰游戏,我需要一些帮助来整理船只。开始了。

我有一个船课:

class Ship {
public:
    Ship(char symbol, PositionChar position, char orientation, unsigned int size, unsigned int color);
private:
    unsigned int number;
    char symbol;
    PositionInt position;
    char orientation;
    unsigned int size;
    unsigned int color;
    string status;

};

我有一个董事会课程,其中包含:

vector <Ship> ships;

我需要从一个.txt加载信息:

tabuleiro: 10 x 10 
1 - Porta-avioes - 5 - P - Vermelho_claro 
1 - Fragata      - 4 – F - Magenta_claro 
2 - Cruzador     - 3 - C - Verde_claro   
3 - Submarino    - 2 - S - Castanho 
4 - Lancha       - 1 - L - Azul_claro  

使用此信息获取信息:

while (getline(config, tmp)) {          
        config >> nr >> tmp >> nome >> tmp >> size >> tmp >> simb >> tmp >> cor; //de maneira analoga ao tabuleiro faz ignora os espaços e recolhe a info dos navios
        if (config.eof())
            break;

nr-船只数量Nome-船的名字尺寸 - 尺寸SIMB-代表它的炭COR-颜色

现在,我的问题是。我需要存储所有这些船只(每行都是一艘船)以及向量上的信息。向量中的每个元素将包含我从TXT。

加载的所有信息。

我该怎么做?

预先感谢您

最好的问候

我首先要为您的ship类重载operator>>

std::istream &operator>>(std::istream &is, Ship &s) { 
    std::string tmp;
    return is >> s.nr >> tmp 
              >> s.nome >> tmp 
              >> s.size >> tmp 
              >> s.simb >> tmp 
              >> s.cor;
}

这使您可以直接从文件读取数据到Ship对象,例如:

std::ifstream in("yourfile.txt");
Ship some_ship;
in >> some_ship;

它也(与其他流提取器一样)返回对您正在阅读的istream对象的引用。这允许两件事。第一个是链接操作员,因此您可以一次阅读两个(或更多)项目:

in >> ship_a >> ship_b;

这也意味着您可以检查流提取是否成功:

if (in >> some_ship)
    // ...

...或在到达文件末尾时(例如)退出的循环阅读:

while (in >> some_ship)
    process(some_ship);

标准还包括一种istream_iterator类型,该类型将使用operator>>通过迭代器接口读取内容。您可以将其用于(一个示例)读取一个完整的船只对象的文件,并使用它们来初始化向量:

std::ifstream input("YourFilename.txt");
std::vector<Ship> ships { std::istream_iterator<Ship>(input),
                          std::istream_iterator<Ship>() };

这确实有一个缺点:它隐含地假设一旦您阅读了一个记录的结尾,就会有一些白色空间(空格,标签,纽线等),然后立即将是下一个Ship对象的记录。如果您的输入文件可能在行末端包含一些额外的垃圾(在船舶对象本身的所有字段之后),则可以在数据行中读取,然后使用stringstream将对象从该行中解散:

std::string s;
Ship temp;
while (std::getline(input, s)) {
    std::istringstream is(s);
    if (!is >> temp)
        break;
    ships.push_back(temp);
}

这使您可以在一条线结束时扔掉任何多余的数据。您一次读取文件一行,然后解析您从该行关心的数据。完成此操作后,您只会忽略剩下的任何东西,然后进入下一行。

直接在此处解决您的关注

ships.push_back(Ship(nr,nome,size,...))

这应该在每艘船的循环中进行。