【问题标题】:How to initialize a vector in a struct in c++如何在 C++ 中初始化结构中的向量
【发布时间】:2016-07-23 07:27:04
【问题描述】:

我在使用 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));

在 main 的中间,我正在尝试使用它:

grupo->vertices.push_back(x);

但它不断使程序崩溃。我正在使用 Visual Studio,并使用调试模式。我可以看到这是将 X 推到崩溃的向量时(x 有一个值)。我试图将向量更改为浮点数组。所以我能想象的问题是向量的初始化......你能帮我解决我遗漏的问题吗?

谢谢你:)

【问题讨论】:

  • 本题与[c]无关,请勿标记。
  • @AnttiHaapala 你是对的,对此感到抱歉。
  • 我发现你的变量与结构同名,这很令人困惑。
  • 另外,尝试完全摆脱指针和malloc()。尝试使用std::vector 或其他 stl 容器来完成所有操作。

标签: c++ vector struct


【解决方案1】:

您使用的是 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);”
【解决方案2】:

因为您使用的是 C++;如果你想动态创建一个grupo,你应该使用new操作符和构造函数:

grupo = new grupo();

malloc 未正确初始化 C++ 对象,例如 std::vector


附:我不确定grupo-&gt;modelosgrupo-&gt;grupos 应该是什么,但我会为它们使用适当的C++ 类型(也许modelos 应该是std::string 等)。此外,我怀疑您的 *modelosgrupos 来说都太多了。

【讨论】:

  • 这行得通 :D 只是想知道,这是否会使我的结构默认值 0 上的所有浮点数和整数?还是我应该在结构中强制它来制作它们?
  • 您应该阅读有关构造函数的内容,并且在不需要时不应使用指针。不,除非您指定,否则 pod(int、chars..)没有默认值。
【解决方案3】:

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,一个带有要使用的参数(而不是文字常量)的 ctor,这样您就可以构建多个 grupo。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 2014-07-06
    • 1970-01-01
    • 2011-12-25
    • 2021-01-31
    • 1970-01-01
    • 2012-07-27
    相关资源
    最近更新 更多