如何在c ++中初始化结构中的向量

时间:2016-04-03 20:54:51

标签: c++ vector struct

我在c ++中遇到了矢量问题。我是c ++的新手,所以请记住这一点。

所以我在程序开始时有以下结构:

typedef struct grupo
{
    float transX, transY, transZ, rotX, rotY, rotZ, rotAngle, scaleX, scaleY, scaleZ;
    char **modelos;
    struct grupo** grupos;
    int nNomes = 0, nGrupos=0;
    std::vector<float> vertices;
};

struct grupo *grupo;

我就像这样开始主力:

grupo = (struct grupo*)malloc(sizeof(struct grupo));
grupo->modelos = (char **)malloc(sizeof(1));
grupo->grupos = (struct grupo **)malloc(sizeof(struct grupo));

在主要的中间我试图使用它:

grupo->vertices.push_back(x);

但它一直在破坏程序。我正在使用visual studio,并使用调试模式。我可以看到将X推送到崩溃的向量时(x有一个值)。我试图将矢量更改为浮点数组。所以我能想象的问题是矢量的初始化......你能帮我解决一下我缺少的东西吗?

谢谢:)

3 个答案:

答案 0 :(得分:5)

因为您正在使用C ++;如果要动态创建grupo,则应使用new运算符和构造函数:

grupo = new grupo();

malloc无法正确初始化{+ 1}}等C ++对象。

P.S。我不确定std::vectorgrupo->modelos应该是什么,但我会为它们使用正确的C ++类型(也许grupo->grupos应该是modelos等等)。此外,我怀疑您std::string*的{​​{1}}过多modelos

答案 1 :(得分:5)

你正在使用C ++,你不需要&#34;新的&#34;或malloc关键字除非特殊原因。你不需要结构的typedef。

我不确定你的char **应该是什么,但你可以使用std :: string作为字符串。

也许您正在尝试做的是:

struct Grupo
{
    float transX, transY, transZ, rotX, rotY, rotZ, rotAngle, scaleX, scaleY, scaleZ;
    std::string modelos;
    int nNomes = 0, nGrupos=0;
    std::vector<float> vertices;
};

主要:

Grupo grupo;
grupo.vertices.push_back( ... );

然后我建议你多读一些关于什么是C ++语言以及它不是C的语言。

答案 2 :(得分:1)

C ++在声明中不需要typedef。

要正确初始化结构,您应该编写一个ctor来替换编译器提供的ctor(通常什么都不做)。

类似以下内容(只有几个属性):

struct grupo
{
   float transX, transY;
   // ...
   int nNomes;
   int nGrupos;
   std::vector<float> vertices;

   // I prefer initialization list form
   grupo() : transX(0.0),
             transY(1.0),
             // ...
             nNomes(0),
             nGrupos(0)
             // vertices default ctor is ok, creates empty vector
      {
         // use vertices.push_back(...); to fill vertices
      }

};

grupo grupo;

接下来,您将要编写一个更有用的ctor,一个包含要使用的参数(而不是文字常量),以便您可以构建多个grupo。

grupo grupo1(1.0, 2.0, 3, 4);
grupo grupo2(3.0, 4.0, 5, 6);
// etc.