提问者:小点点

C++结构中的私有变量被修改而不使用赋值函数,不知道为什么?-OpenGL粒子系统


我正在使用OpenGL编写我的第一个粒子系统,但我被一个无法解释的错误困住了。我的粒子结构的“active”属性是私有的(在调试这个问题时),我有accessor/mutator函数,用于在使用时将打印到控制台(同样用于调试)。

我在粒子结构中构造函数中实例化active=false。在main()方法中,我打印每个粒子的“active”值,并且它们都被设置为true,即使看起来没有调用mutator方法。

我只在由glutIdleFunc()回调函数调用的函数中调用mutator方法,该回调函数直到打印particle.active值的main()中的代码之后才设置。

下面是一些代码,如果它能提供洞察力的话:

struct RainDrop {
  private:
    bool active;

  public:
    glm::vec3 position, velocity, color;
    float     life;

    RainDrop(): 
      position(0.0f, 0.0f, 0.0f), 
      velocity(0.0f), 
      color(1.0f), 
      life(0.0f),
      active(false)
      { }
    
    void setActive(bool b, std::string caller) {
      active = b;
    }

    bool getActive() {
      return active;
    }
};

struct Rain {
  std::vector<RainDrop*> drops;

  Rain() {
    drops = std::vector<RainDrop*>();

    RainDrop drop;
    unsigned int i;
    for (i = 0; i < NUM_RAIN_DROPS; i++) {
      drop = RainDrop();
      drops.push_back(&drop);
    }
  }
};

int main(int argc, char *argv[])
{
  viewer.position.x = 400;
  ... more viewer setting

  // Add all rain to inactive stack
  for (unsigned int i = 0; i < NUM_RAIN_DROPS; i++) {
    inactiveRain.push(rain.drops[i]);
  }

  srand(time(NULL));
  initGraphics(argc, argv);   
  glEnable(GL_POINT_SMOOTH);
  glutIdleFunc(stepRain);
  glutMainLoop();             
}

共1个答案

匿名用户

此处:

  Rain() {
    drops = std::vector<RainDrop*>();

    RainDrop drop;
    unsigned int i;
    for (i = 0; i < NUM_RAIN_DROPS; i++) {
      drop = RainDrop();
      drops.push_back(&drop);
    }
  }

raindrop分配给局部变量drop,然后将该局部变量的地址存储在成员向量中。一旦这个构造函数返回,本地的drop就会消失。它的生命结束了。向量中的指针无效。以后取消引用它会调用未定义的行为。

您很可能希望使用std::vector;删除;。要避免使用原始指针,如果没有理由使用间接级别,向量应该存储对象,而不是指向对象的指针。

我必须承认,我没有完全理解您的问题,但这个问题需要先解决,因为在存在未定义行为的情况下,代码可以做任何事情,也可以什么都不做。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|结构|中|私有|变量|修改|赋值|函数|不知道|opengl|粒子|系统)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?