Проблемы с получением содержимого в скобках - PullRequest
1 голос
/ 25 февраля 2011

monsters.yaml

- name: Ogre
      position: [0, 5, 0]
      powers:
        - name: Club
          damage: 10
        - name: Fist
          damage: 8
    - name: Dragon
      position: [1, 0, 10]
      powers:
        - name: Fire Breath
          damage: 25
        - name: Claws
          damage: 15
    - name: Wizard
      position: [5, -3, 0]
      powers:
        - name: Acid Rain
          damage: 50
        - name: Staff
          damage: 3

main.cpp

#include "yaml-cpp/yaml.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

// our data types
struct Vec3 {
   float x, y, z;
};

struct Power {
   std::string name;
   int damage;
};

struct Monster {
   std::string name;
   Vec3 position;
   std::vector <Power> powers;
};

// now the extraction operators for these types
void operator >> (const YAML::Node& node, Vec3& v) {
   node[0] >> v.x;
   node[1] >> v.y;
   node[2] >> v.z;
}

void operator >> (const YAML::Node& node, Power& power) {
   node["name"] >> power.name;
   node["damage"] >> power.damage;
}

void operator >> (const YAML::Node& node, Monster& monster) {
   node["name"] >> monster.name;
   node["position"] >> monster.position;
   const YAML::Node& powers = node["powers"];
   for(unsigned i=0;i<powers.size();i++) {
      Power power;
      powers[i] >> power;
      monster.powers.push_back(power);
   }
}

int main()
{
   std::ifstream fin("monsters.yaml");
   YAML::Parser parser(fin);
   YAML::Node doc;
   parser.GetNextDocument(doc);
   for(unsigned i=0;i<doc.size();i++) {
      Vec3 v;
      doc[i] >> v;
      std::cout << v.x << "\n";
      std::cout << v.y << "\n";
      std::cout << v.z << "\n";
   }

   return 0;
}

Я думал, что если я изменю код аналогичным образом, контент Vec3 будет размещен, но это не так. Что я делаю не так?

1 Ответ

0 голосов
/ 25 февраля 2011

Ваш документ YAML представляет собой последовательность "монстров", а не "векторов". Чтобы добраться до атрибута position, вам необходимо:

doc[i]["position"] >> v;

Кроме того, в вашем YAML есть ошибки отступа (последовательность верхнего уровня не выстроена в очередь). Я предполагаю, что это правильно в вашем файле; будьте осторожны при копировании здесь.

...