Pergunta

Eu criei um par de estruturas diferentes em um programa. Agora tenho uma estrutura com estruturas aninhadas no entanto eu não posso trabalhar para fora como para inicializar corretamente. As estruturas estão listados abaixo.

/***POINT STRUCTURE***/
struct Point{
    float x;                    //x coord of point
    float y;                    //y coord of point
};

/***Bounding Box STRUCTURE***/
struct BoundingBox{
    Point ymax, ymin, xmax, xmin;
};

/***PLAYER STRUCTURE***/
struct Player{
    vector<float> x;            //players xcoords
    vector<float> y;            //players ycoords
    BoundingBox box;
    float red,green,blue;       //red, green, blue colour values
    float r_leg, l_leg;         //velocity of players right and left legs
    int poly[3];                //number of points per polygon (3 polygons)
    bool up,down;               
};

Eu, então, tentar intialse um jogador recém-criado struct chamado jogador.

//Creates player, usings vectors copy and iterator constructors
Player player = { 
vector<float>(xcords,xcords + (sizeof(xcords) / sizeof(float)) ), //xcords of player
vector<float>(ycords,ycords + (sizeof(ycords) / sizeof(float)) ), //ycoords of playe
box.ymax = 5;               //create bounding box
box.ymin = 1;
box.xmax = 5;
box.xmin = 1;
1,1,1,                      //red, green, blue
0.0f,0.0f,                  //r_leg,l_leg
{4,4,4},                    //number points per polygon
true,false};                //up, down

Isso faz com que vários erros diferentes, relativos caixa. Afirmando a caixa tem nenhum identificador claro e struct em falta ou sintaxe antes ''.

Então eu tentei apenas para criar uma estrutura Player e inicialize-o de membros da seguinte forma:

Player bob;
bob.r_leg = 1;

Mas isso causa mais erros, como o compilador acha que Bob tem nenhum identificador ou está faltando alguma sintaxe.

Eu pesquisei o problema, mas eu não encontrar nenhum artigo mostrando-me como initalise muitos membros diferentes de estruturas aninhadas dentro da estrutura (pai). Qualquer ajuda sobre este assunto seria muito apreciada :-) !!!

Foi útil?

Solução

Você inicializar normalmente com { ... }:

Player player = { 
  vector<float>(xcords,xcords + (sizeof(xcords) / sizeof(float)) ),
  vector<float>(ycords,ycords + (sizeof(ycords) / sizeof(float)) ),
  5, 1, 5, 1, 5, 1, 5, 1, 
  1.0f,1.0f,1.0f,                         //red, green, blue
  0.0f,0.0f,                              //r_leg,l_leg
  {4,4,4},                                //number points per polygon
  true,false
};   

Agora, que está usando "elisão cinta". Alguns compiladores alertar para que, mesmo que ele é completamente normal, porque poderia confundir os leitores. Melhor você adiciona chaves, por isso torna-se claro o que é inicializado em que:

Player player = { 
  vector<float>(xcords,xcords + (sizeof(xcords) / sizeof(float)) ),
  vector<float>(ycords,ycords + (sizeof(ycords) / sizeof(float)) ),
  { { 5, 1 }, { 5, 1 }, { 5, 1 }, { 5, 1 } }, 
  1.0f, 1.0f, 1.0f,               //red, green, blue
  0.0f, 0.0f,                     //r_leg,l_leg
  { 4, 4, 4 },                    //number points per polygon
  true, false
};

Se você quiser apenas para inicializar o membro x dos pontos, você pode fazê-lo, omitindo o outro inicializador. Restante elementos em agregados (arrays, estruturas) será o valor inicializado com os valores "certos" - assim, um NULL para ponteiros, um false para bool, zero para ints e assim por diante, e usando o construtor para tipos definidos pelo usuário, aproximadamente. A linha de inicialização dos pontos parece com isso, então

{ { 5 }, { 5 }, { 5 }, { 5 } }, 

Agora você pode ver o perigo de usar cinta elisão. Se você adicionar algum membro de sua estrutura, todos os inicializadores são "deslocados Apart" seus elementos reais que deve inicializar, e eles podem atingir outros elementos acidentalmente. Então é melhor você sempre use chaves se for o caso.

Considere o uso de construtores embora. I acabou de completar sua exibição código como você faria isso usando cinta fechado initializers.

Outras dicas

Você pode adicionar valores padrão para uma estrutura assim:

struct Point{
   Point() : x(0), y(0)
     { };

   float x;
   float y;
};

ou

struct Point{
   Point() 
     { 
       x = 0;
       y = 0;
     };

   float x;
   float y;
};

Para adicionar esses valores durante a construção, adicione parâmetros para construtores como esta:

struct Point{
   Point(float x, float y) 
     { 
       this->x = x;
       this->y = y;
     };

   float x;
   float y;
};

e instanciar-los com estes:

Point Pos(10, 10);
Point *Pos = new Point(10, 10);

Isso também funciona para suas outras estruturas de dados.

Parece que a caixa delimitadora deve conter apenas flutua, não Points?

Dito este trabalho poder:

Player player = { 
vector<float>(xcords,xcords + (sizeof(xcords) / sizeof(float)) ), //xcords of player
vector<float>(ycords,ycords + (sizeof(ycords) / sizeof(float)) ), //ycoords of playe
{{1.0,5.0},{1.0,5.0},{1.0,5.0},{1.0,5.0}},
1,1,1,                                          //red, green, blue
0.0f,0.0f,                              //r_leg,l_leg
{4,4,4},                                //number points per polygon
true,false};  

(não testado) ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top