将参数添加到该类

时间:2015-05-07 20:05:06

标签: c++

我正在进行BattleShip游戏,我需要一些帮助整理船只。开始了。

我有一个船级:

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;


};

我有一个Board类,其中包含:

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 - 代表它的char cor - color

现在,我的问题是。我需要存储所有这些船(每条线都是一艘船)和矢量信息。向量中的每个元素都将包含我从txt加载的所有信息。

我该怎么做?

提前谢谢

祝你好运

2 个答案:

答案 0 :(得分:2)

我首先要为operator>>课程重载ship

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>>通过迭代器接口读取内容。您可以使用它来(例如)读取一个装满Ship对象的整个文件,并使用它们来初始化一个向量:

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

这确实有一个缺点:它隐含地假设一旦你读完一条记录的结尾,你就会有一些空格(空格,制表符,换行符等)然后立即将成为下一个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);
}

这允许您在一行结尾处丢弃任何多余的数据。您一次读取一行文件,然后从该行解析您关心的数据。当你完成后,你只需忽略剩下的任何内容,然后继续下一行。

答案 1 :(得分:1)

直接解决您的疑虑

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

这应该在每艘船的循环中完成。