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

7
我在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有一个值)。我已经尝试将向量更改为浮点数数组。所以我能想象的问题是向量的初始化...你能帮忙看看我缺少了什么吗?谢谢 :)

这个问题与 [c] 无关,请不要打上标签。 - Antti Haapala -- Слава Україні
@AnttiHaapala 你是对的,抱歉。 - Peter L.
我觉得很困惑,你的变量和结构体同名。 - Frank Puffer
另外,尝试完全摆脱指针和malloc()。尝试使用std::vector或其他STL容器完成所有操作。 - Frank Puffer
3个回答

6

您正在使用C++,除非出于特定原因,否则不需要使用“new”或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语言的区别,请阅读相关资料。


char?- 我很少使用它。只有一个例外。"int main(int argv, char argv[]);"可以写成"int main(int argv, char* argv);"。 - 2785528

5

如果您使用的是C++,并且想要动态创建一个名为grupo的对象,您应该使用new操作符和相应的构造函数:

grupo = new grupo();

malloc函数不能正确初始化C++对象,例如std::vector


P.S. 我不确定grupo->modelosgrupo->grupos应该是什么,但我会为它们使用正确的C++类型(也许modelos应该是std::string等)。另外,我怀疑你在modelosgrupos两个变量的指针前面多了一个*


这个有效:D只是想知道,这是否使得我的结构体中的所有浮点数和整数默认值为0?或者我应该在结构体中强制指定它们的值? - Peter L.
1
你应该了解构造函数,并且在不需要指针时不要使用它。对于 PODs(例如 int,char 等),除非您指定,否则没有默认值。 - Nikko

1

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

为了正确初始化一个结构体,你应该编写一个构造函数来替换编译器提供的构造函数(通常什么也不做)。

像下面这样(只有几个属性):

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;

接下来,您需要编写一个更加实用的构造函数,其中包含参数(而不是字面常量),这样您就可以构建多个组。
grupo grupo1(1.0, 2.0, 3, 4);
grupo grupo2(3.0, 4.0, 5, 6);
// etc.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接