2012-03-10 6 views
0

Хорошо, поэтому я экспериментирую с созданием простой игры. У меня есть структура под названием «Оборудование» со структурами внутри нее для каждой части, например, «Шлем», «Тело» и т. Д. В конструкторе «Оборудование» я создаю объекты подструктур и в конструкторах подструктур, у которых они инициализируются строковыми векторами.Вложенные структуры и доступ к данным в C++

Так что моя проблема заключается в том, что в моей основной функции я создаю объект оборудования, но когда я пытаюсь получить доступ, например woodHelm, я получаю ошибку компиляции: «struct Equipment» не имеет члена с именем «helm». Что я делаю не так? Или есть другой способ, я могу сделать это лучше?

Вот мой Equipment.h (игнорировать другие подгруппы структур, я нету инициализируются их еще нет):

#ifndef EQUIP_H 
#define EQUIP_H 
#include <vector> 
#include <string> 

using namespace std; 

struct Equipment{ 
    Equipment(); 
    struct Helmet{ 
    Helmet(){ 
     const char* tmp[] = {"Wooden Helmet","1",""}; 
     vector<string> woodHelm (tmp,tmp+3); 
     const char* tmp1[] = {"Iron Helmet","2",""}; 
     vector<string> ironHelm (tmp1,tmp1+3); 
     const char* tmp2[] = {"Steel Helmet","3",""}; 
     vector<string> steelHelm (tmp2,tmp2+3); 
     const char* tmp3[] = {"Riginium Helmet","5","str"}; 
     vector<string> rigHelm (tmp3,tmp3+3); 
    } 
    }; 
    struct Shield{ 
    Shield(){ 
     vector<string> woodShield(); 
     vector<string> ironShield(); 
     vector<string> steelShield(); 
     vector<string> rigShield(); 
    } 
    }; 
    struct Wep{ 
    Wep(){ 
     vector<string> woodSword(); 
     vector<string> ironSword(); 
     vector<string> steelSword(); 
     vector<string> rigSword(); 
    } 
    }; 
    struct Body{ 
    Body(){ 
     vector<string> woodBody(); 
     vector<string> ironBody(); 
     vector<string> steelBody(); 
     vector<string> rigBody(); 
    } 
    }; 
    struct Legs{ 
    Legs(){ 
     vector<string> woodLegs(); 
     vector<string> ironLegs(); 
     vector<string> steelLegs(); 
     vector<string> rigLegs(); 
    } 
    }; 
    struct Feet{ 
    Feet(){ 
     vector<string> leatherBoots(); 
     vector<string> ironBoots(); 
     vector<string> steelBoots(); 
     vector<string> steelToeBoots(); 
     vector<string> rigBoots(); 
    } 
    }; 
}; 


#endif 

Equipment.cpp:

#include <iostream> 
#include "Equipment.h" 

using namespace std; 

Equipment::Equipment(){ 
    Helmet helm; 
    Shield shield; 
    Wep wep; 
    Body body; 
    Legs legs; 
    Feet feet; 
} 

и main.cpp:

#include <iostream> 
#include "Player.h" 
#include "Equipment.h" 
#include "Items.h" 
#include "conio.h" 

using namespace std; 
using namespace conio; 

void init(); 

int main(int argc, char* argv[]){ 
    /****INIT****/ 
    Player p(argv[1],10,1,1); 
    Equipment equip; 
    Items items; 

    cout << clrscr() << gotoRowCol(3,5) << "Player Stats: (" << p.getName() << ")"; 
    cout << gotoRowCol(4,5) << "HP: " << p.getHP() << 
    gotoRowCol(5,5) << "Att: " << p.getAtt() << 
    gotoRowCol(6,5) << "Def: " << p.getDef(); 

    //this is where it is messing up 
    p.addHelm(equip.helm.woodHelm); 


    cout << gotoRowCol(20,1); 
} 

ответ

4

Ну, я бы не рекомендовал вложенные структуры как это - поместить каждый на уровне родителей. И почему бы не использовать «класс»? Но то, что вы делаете, возможно. Следующий фрагмент кода может установить вас в правильном направлении:

#include <iostream> 

struct A { 
    struct B { 
     int c; 
     B() { 
      c = 1; 
     } 
    }; 

    B b; 
}; 


int main() { 
    A a; 

    std::cout << a.b.c; 
} 
+0

Спасибо. В этом есть смысл. Это немного больше кода, чем хотелось бы, но он работает. – adamk33n3r

1

Потому что у вас нет члена имя штурвала в вашем оборудовании структуры. У вас есть только локальный переменный шлем в вашем конструкторе, но он перестает существовать, как только конструктор выходит.

То, что вы, вероятно, хотел добавить что-то вроде этого

struct Equipment { 
    struct Helmet { 
     ... 
    }; 
    Helmet helm; /// this is the line you are missing 
    struct Shield { 
     ... 
    }; 
    ... 
}; 
+0

Благодарим вас за пример использования имен структур, которые я использовал. Это, в сочетании с @Jameson, дало мне действительно помогло мне. – adamk33n3r

+0

Добро пожаловать. Если ответ вам помог, проголосуйте за него, используя стрелку вверх над большим номером в верхнем левом углу ответа. – ComicSansMS

+0

Я бы хотел, но он сказал, что мне нужно 15 репутации, чтобы сделать это: / – adamk33n3r

Смежные вопросы