智能指针和原始指针的语义

时间:2017-12-08 17:30:46

标签: c++ pointers

我不确定完全了解何时在原始指针上使用智能指针。

我有以下代码结构。

首先,Snake_cell定义如下

struct Snake_cell
{
  Snake_cell(const unsigned int origin_x, const unsigned int origin_y)
  unsigned int origin_x_;
  unsigned int origin_y_;
};

然后,我有一个Snake,其中包含vector Snake_cell

class Snake
{
public:
  Snake(const unsigned int first_cell_x, const unsigned int first_cell_y);

private:
  std::vector<std::shared_ptr<Snake_cell>> cells_;
};

Snake::Snake(const unsigned int first_cell_x, const unsigned int first_cell_y)
{
  // Create three successives cells
  cells_.emplace_back(std::make_shared<Snake_cell>(first_cell_x, first_cell_y));
  cells_.emplace_back(std::make_shared<Snake_cell>(first_cell_x + CELL_SIZE, first_cell_y));
  cells_.emplace_back(std::make_shared<Snake_cell>(first_cell_x + 2 * CELL_SIZE, first_cell_y));
}

最后,我有一个遵循以下格式的main.cpp文件:

std::unique_ptr<Snake> snake(std::make_unique<Snake>(500-CELL_SIZE, 500-CELL_SIZE));

void func1(...)
{
}

void func2(...)
{
}

void func2(...)
{
}
/** Main **/
int main(int argc, char* argv[])
{
  return 0;
}

这些功能中的每一个或其中一些都是渲染功能,所以它们会被调用很多时间。

  • 访问Snake属性
  • 修改Snake属性

因此,对我来说这是有意义的,以避免将Snake_cellSnake个对象的不必要副本复制到:

  • vector
  • 中定义smart pointers Snake_cellSnake
  • smart pointer
  • 中创建Snakemain.cpp

然而,我认为我做得不对,可以使用原始指针。

  • 我的假设在这里使用pointers是否正确? 我知道我们没有处理大量数据,但会调用funcX 很多时间因此可能会变得昂贵

  • 如果是的话,我在这里使用smart pointers是对的吗? 我已经读过,每次我都应该优先考虑原始指针; m考虑使用指针。

  • 如果是,我是否可以在此使用shared_ptr 在我的代码中,我创建了一个新的smart_ptr对象每当我需要使用它时,在snake对象上。我觉得这不是正确的使用方式。

例如,这是我正在使用的一个功能。

void display()
{
  glClear(GL_COLOR_BUFFER_BIT);
  glColor3f(1.0f, 1.0f, 1.0f);

  glBegin(GL_QUADS);
    for(unsigned int i = 0; i < snake->size(); ++i)
    {
      std::shared_ptr<Snake_cell> cell(snake->getCell(i));
      glVertex2i(cell->origin_x_, cell->origin_y_);
      glVertex2i(cell->origin_x_ + CELL_SIZE, cell->origin_y_);
      glVertex2i(cell->origin_x_ + CELL_SIZE, cell->origin_y_ + CELL_SIZE);
      glVertex2i(cell->origin_x_, cell->origin_y_ + CELL_SIZE);
    }
  glEnd();

  glutSwapBuffers();
}

感谢您的帮助,

0 个答案:

没有答案