2011-02-25 119 views
1

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; 
} 

我認爲,如果我類似修改代碼,VEC 3的內容將被couted,但它沒有。我究竟做錯了什麼?

回答

0

您的YAML文檔是一系列「怪物」,而不是「矢量」。要進入「位置」屬性,你需要:

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

此外,您YAML有縮進錯誤(頂級序列不排隊)。我假設你的文件是正確的;在這裏複製時請小心。